【问题标题】:open connection before every single nonquery or one connection for the whole?在每个非查询或整个连接之前打开连接?
【发布时间】:2012-01-28 18:19:57
【问题描述】:

如果我有大约2000 record 并且我进行了多次插入。哪种方法的性能比另一种更好?

  • 与每个插入的连接。插入后关闭。
  • 一个连接用于整个批量并关闭连接 结尾。以及这种情况下的连接超时情况。

注意事项

  • 数据库是informix db。

  • 插入大约 6000 条记录大约需要 3.5 到 4 分钟。(使用 第一种方法)

【问题讨论】:

  • 对我来说是第二种选择。您不需要在每次要进行声明时打开和关闭。每个打开的连接都需要处理池的连接。使用相同的连接,您只需到池中请求一次连接

标签: c# asp.net performance connection informix


【解决方案1】:

我最近对一个非常相似的情况做了一些修改。我有一个应用程序,可以将 1 到几千条记录插入 MySQL 数据库。

为了(向您自己)演示 Magnus 在他的回答中描述的连接池行为,您可以创建一个快速应用程序。使用按钮并在单击事件上打开(然后 .close() )与数据库的连接,然后单击按钮以“重新打开”连接几次。 (确保给自己一些反馈,以便知道 .open() 何时(以及是否)成功。)您会注意到初始连接需要几秒钟,但是当从池中获取连接时,后续尝试非常快。

根据我的负责人的要求,我们最终通过动态生成大的插入语句来进行“批量”插入,更多的是“全有或全无”方法,而不是单独的插入语句。有一次,我有两个版本的程序使用单独的插入,还有批量插入方法。 对于我们的情况,我并没有真正看到任何明显的性能差异。 (公平地说,也没有完成大量工作)

【讨论】:

    【解决方案2】:

    应用程序连接池将在很大程度上使这个问题变得无关紧要,因为 c# 应用程序池已针对对同一数据库的多次调用进行了优化。

    也就是说,我所做的符合以下规则:

    如果您可以打开一个连接,然后使用“使用”语法进行多项操作:

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        // Do work here; connection closed on following line.
    }
    

    然后保持连接打开并执行所有操作。

    但是,如果每条记录都被操作然后保存,以至于您必须在每个点打开一个新连接,请不要担心太多。您仍然会在连接池方面表现出色。

    来自 MSDN:

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx

    要部署高性能应用程序,您必须使用连接池。当您使用 SQL Server 的 .NET Framework 数据提供程序时,您不必启用连接池,因为提供程序会自动管理它,尽管您可以修改某些设置。有关详细信息,请参阅 SQL Server 连接池 (ADO.NET)。

    即使您的连接不是 SQL 连接,其他来源的内置连接提供程序也会以类似的方式运行。

    【讨论】:

      【解决方案3】:

      连接的默认行为是将其添加到池中。因此,当调用 Close() 时,它并没有真正关闭,而是释放到池中,当在新连接上调用 Open() 时,会从池中选择现有的打开连接。
      如果禁用池并打开在完整插入期间的连接优于在每次插入后关闭它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 2020-09-13
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        相关资源
        最近更新 更多