我正在尝试创建一个小的测试应用程序,该应用程序读取FileStream的块并将其附加到SQL Server 2005 Express的VarBinary(max)列中。
一切正常,该列将按预期的方式填充,但我的机器似乎仍将所有内容缓冲到内存中,而我只是看不到为什么。
我正在使用以下代码(C#):
using (IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString)) { connection.Open(); string id = Guid.NewGuid().ToString(); using (IDbCommand command = connection.CreateCommand()) { command.CommandText = "INSERT INTO [BLOB] ([Id],[Data]) VALUES (@p1,0x0)"; SqlParameter param = new SqlParameter("@p1", SqlDbType.VarChar); param.Value = id; command.Parameters.Add(param); command.ExecuteNonQuery(); } if (File.Exists(textBox1.Text)) { using (IDbCommand command = connection.CreateCommand()) { command.CommandText = "UPDATE [BLOB] SET [Data].WRITE(@data, @offset, @len) WHERE [Id]=@id"; SqlParameter dataParam = new SqlParameter("@data", SqlDbType.VarBinary); command.Parameters.Add(dataParam); SqlParameter offsetParam = new SqlParameter("@offset", SqlDbType.BigInt); command.Parameters.Add(offsetParam); SqlParameter lengthParam = new SqlParameter("@len", SqlDbType.BigInt); command.Parameters.Add(lengthParam); SqlParameter idParam = new SqlParameter("@id", SqlDbType.VarChar); command.Parameters.Add(idParam); idParam.Value = id; using (FileStream fs = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read, FileShare.Read)) { byte[] buffer = new byte[2090400]; //chunk sizes that are multiples of 8040 bytes. int read = 0; int offset = 0; while ((read = fs.Read(buffer, 0, buffer.Length)) > 0) { dataParam.Value = buffer; offsetParam.Value = offset; lengthParam.Value = read; command.ExecuteNonQuery(); offset += read; } } } } }
谁能告诉我为什么它将文件缓冲到内存中?byte[]我正在使用的缓冲区大小几乎只有2 MB。
byte[]
我可以为每个块创建一个新的缓冲区,但这似乎也浪费了CPU /内存。
它缓冲它,因为当您将其保存到varbinary列中时,它将成为sql服务器中LOB数据高速缓存的一部分。这就是它的工作原理。
还是您说它在其他地方被缓冲了?