c# - 循环内 SqlConnection 的最佳方式

标签 c# sql-server

<分区>

我每天在 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 查询参数的最大数量,因此只需将其除以您需要的数量并减去误差范围),我可能会说只是为每个人创建连接。

我知道这比你要求的要多得多,但我经常处理这样的情况,所以我想我会分享一些我一路上学到的东西。

关于c# - 循环内 SqlConnection 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24766289/

相关文章:

c# - X-HTTP-Method-Override 在 ASP.NET Web API 上给出 NotFound (404)

c# - 集成测试策略资源

c# - 非泛型类中的泛型方法

sql-server - 如何使用批处理中的参数运行 sqlcmd 并将返回值分配给变量?

sql - 如何使用 SELECT * INTO tempTable FROM CTE 查询创建临时表

mysql - SQL:通过掩码从表中选择唯一的子字符串

sql-server - 在 SQL Server 中定义字符串常量?

c# - 在 C# 中,事件重定向是一种好的做法吗?如果属实,那么 'sender' 应该是谁?

c# - 读取自定义配置部分返回 "Invalid Key Value"

sql-server - 如何存储多年值(value)的 100 x 25 Hz 时间序列 - Sql Server 或时间序列数据库