我有一个用ASP.NET MVC编写的带有Server后端的web服务。客户端可以以调用web服务的方式发送大数据,每个调用的大小为10兆字节。
在服务器端,我希望读取HTTP请求流,并将其写入SQL表中的VARBINARY字段。如何做到这一点,而不必将整个流读入内存中的数组中。
我之所以关心内存,是因为这个系统需要扩展到1000个并发客户端(至少)。
我目前正在将Linq用于SQL,它看起来不支持数据流,因为Linq二进制类型只能使用字节数组进行初始化。
还有其他方法可以使用Linq到SQL来完成这个任务吗?
如果使用Linq是不可能的,我如何使用ADO.NET或其他方法来做到这一点?
发布于 2010-12-30 19:04:42
您可以将数据流到磁盘,然后使用开环执行数据的大容量导入。例如:
INSERT INTO YOURTABLE(binaryColumnName)
SELECT * FROM
OPENROWSET(BULK N'C:\data.bin', SINGLE_BLOB)您可以使用临时文件API来避免管理磁盘上数据的生存期.一旦不再使用,它将被删除。
发布于 2011-01-04 18:54:25
我相信您可以使用UPDATE语句的.WRITE子句来执行块数据插入。如果使用LINQ,将从数据上下文对象创建两个命令。第一个要创建(插入)将包含数据的行。第二个是使用.WRITE子句的UPDATE语句。参数化数据和偏移值。循环执行,执行UPDATE语句的次数与“块”相同。
插入XrayImages (HeaderId,ImageBytes)值(@headerId,@imageValue)
更新XrayImages SET ImageBytes.WRITE(@imageChunk,NULL,@chunkLength,其中ImageId = @imageId;
有关更多信息,请参阅以下MSDN文章:http://msdn.microsoft.com/en-us/library/bb399384.aspx
我非常肯定,在调用Controller代码时,整个请求已经收到(并且在内存中)。我的基础是Request.Files集合已经知道有多少文件,以及它们的长度。对于多部分表单,我知道如何确定的唯一方法是读取整个请求。无论如何,我不知道如何在MVC中更改这一点,所以您可能需要编写一个处理程序来完成实际的文件上传本身。
这里有很多变量需要考虑。根据同时上传数据的1000个并发客户端的数量,在db服务器和web服务器之间需要多个GB。您还需要数据库服务器上的I/O功能,这将超出我的经验。
我会认真考虑将文件保存到基于位置的文件系统,并将元信息保存在数据库中,特别是如果您可以将文件保存在web服务器上。否则,我认为使用SqlServer的FileStream功能将比单纯的表解决方案更具有可伸缩性。
希望这能帮上忙!
https://stackoverflow.com/questions/4565394
复制相似问题