我每天在 Windows 服务中处理大约 24k 条记录,我将这些行插入数据库,然后将压缩的图像保存在目录中。
一般来说,最好的方法是什么?
using (SqlConnection cnn = new SqlConnection())
{
foreach (var item in collection)
{
//do stuff
SaveImage(item.filename,item.img);
}
}
或
foreach (var item in collection)
{
using (SqlConnection cnn = new SqlConnection())
{
//do stuff
}
SaveImage(item.filename, item.img);
}
谢谢
我会在循环外建立连接。如果它是永远运行的东西,我的答案会有所不同,例如,如果您正在运行网络服务,我会建议您为每个请求打开连接(那是非常不同的,但我只是举个例子)。但是打开一个连接是一项资源密集型任务,在这种情况下,只打开一个连接会更容易。正如其他几个人所说,这实际上取决于您在这里关注的是什么,但我认为单一连接听起来完全可以接受。正如我看到另一位评论者所说,如果这对您有帮助的话,您可以使用事务将其全部包装起来。
剩下的内容并不是要直接回答你的问题,我只是认为根据你的情况值得考虑一下。
不过,您可能想查看 SQL MERGE
语句。如果一次可以向 SQL 发送多条记录,速度会快得多。当然,您仍然必须单独保存图像,但这至少可以使 SQL 方面更快。当然,您也可以使用 INSERT
语句来做到这一点,但这取决于您传递的每条新记录是否实际上是新的,或者它是否会违反唯一键。
您还可以查看 TPL Dataflow因为它有一些有用的类可以同时和批量执行多个操作,这也可能使您的插入速度更快。但请记住,单个连接有时并不是处理并发请求的最佳选择。但是,如果您将数据分成 100 组(请记住 2100 是每个 SqlCommand
查询参数的最大数量,因此只需将其除以您需要的数量并减去误差范围),我可能会说只是为每个人创建连接。
我知道这比你要求的要多得多,但我经常处理这样的情况,所以我想我会分享一些我一路上学到的东西。