【问题标题】:What are the performance implications of using 'Using' on sqlConnections在 sqlConnections 上使用“Using”对性能有何影响
【发布时间】:2009-10-15 11:44:35
【问题描述】:

我遇到了一个article 说像这样使用我的 sqlConnection:

using (SqlConnection sqlConnection = new SqlConnection(Config.getConnectionString()))
            {
                using (SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sqlConnection))
                {
                    dataAdapter.Fill(dataSet);
                }
            }

提高了性能,因为它在方法结束时处理对象。所以我已经用“使用”编码了一段时间,在与其他一些开发人员聊天后,他们说多次创建和销毁实例并不会真正提高性能。

如果我在我的所有 dataAccess 方法上使用“使用”,对 sqlserver 和系统资源的性能有何影响。 sqlServer是否会因为连接被连接和重新连接多次而受到更大的打击?

【问题讨论】:

    标签: c# sql performance


    【解决方案1】:

    SqlConnection 默认启用连接池。 Dispose() 只是更快地释放与池的连接。这意味着其他代码可以重新使用此连接,减少与 SQL 服务器的连接,并减少建立物理连接的时间。

    所以是的:它可以提高整体性能。

    替代方案:

    • 如果您的代码干净地退出并且您始终记得Close() 连接,那么可能没有区别
    • 如果您的代码抛出异常(您尚未处理),或者您忘记Close() 连接,那么您可能会留下未使用的连接,直到内存压力足够触发 GC 和终结器。这可能意味着您需要更多与 SQL 服务器的物理连接(很痛苦),并且每次需要 底层连接时,它都必须承受建立 实际 的性能损失> 数据库连接

    不过,总体而言 - 将IDisposable 视为合同;作为 .NET 开发人员,您的工作是注意IDisposable 资源,并在完成后积极Dispose(),如果使用范围很窄,最好使用using(例如在这种情况下) )。

    【讨论】:

      【解决方案2】:

      在大多数情况下,它对性能没有显着影响。

      所有 using().... 构造确保 SqlConnection 在完成其工作后被释放/处置。仅此而已 - 没有神奇的性能提升....

      当然 - 创建和处置对象确实会消耗一些性能 - 要么就是这样,要么你不必要地将对象保留在内存中,并且与 SQL Server 的连接打开的时间比需要的时间长得多。

      我会在 100% 的情况下投票支持使用 using() {...} 方法 - 它更清洁、更安全,只是更好的编程实践。您可能会受到的“打击”是微不足道的,不值得麻烦。

      马克

      【讨论】:

        【解决方案3】:

        提高了性能,因为在你的连接实例被释放后,池中的物理连接可以被另一个线程重新使用。如果你让它保持打开状态,那么另一个试图打开连接的线程会向池中添加一个新的物理连接。

        【讨论】:

          【解决方案4】:

          ADO.NET 有连接池这样的特性,因此如果你密集打开连接,很可能连接不会被释放,只会返回池中。

          【讨论】:

            【解决方案5】:

            如果您在一个接一个地执行多个数据库操作,您应该使用相同的连接而不是为每个创建一个连接。否则应尽快关闭连接,使其返回连接池,可以重复使用。

            您应该始终使用using 块进行连接,以确保它们已正确关闭。如果您未能关闭连接对象,它将一直留在内存中,直到垃圾收集器将其删除,从而占用数据库连接。这意味着下一个操作不能重用池中的连接,但它必须建立一个全新的连接,这需要更长的时间。

            【讨论】:

              【解决方案6】:

              性能有所提升。

              如果您使用 using

              例如:

              using (SqlConnection sqlConnection = new SqlConnection("ConnectionString"))
                  {
                  }
              

              编译器会自动添加try和finally。

              alt text http://img111.imageshack.us/img111/4514/using.jpg

              【讨论】:

              • 我不明白这如何转化为性能改进。安全性和可读性,当然。
              猜你喜欢
              • 2010-11-12
              • 1970-01-01
              • 1970-01-01
              • 2020-11-04
              • 2015-03-04
              • 1970-01-01
              • 2019-09-04
              • 2021-04-20
              • 1970-01-01
              相关资源
              最近更新 更多