【问题标题】:SqlConnection in .NET -- How can I best harness connection pooling?.NET 中的 SqlConnection——如何最好地利用连接池?
【发布时间】:2009-06-27 05:10:47
【问题描述】:

我读到.NET 使用连接池。

例如,如果我用相同的连接字符串实例化一堆 SqlConnection 对象,那么在内部 .NET 将知道使用相同的连接。

这是正确的吗?

另外,在一个基于 Web 的大型应用程序中,有什么技巧可以利用这种“力量”的最佳方式?

【问题讨论】:

    标签: c# asp.net sql sql-server sql-server-2005


    【解决方案1】:

    在您的 Web 应用程序和 SQL Server 之间建立 TCP 连接可能是一项昂贵的操作。连接池允许将与数据库的连接重新用于后续数据请求。不是在每个请求上都建立一个新的 TCP 连接,而是仅在连接池中没有一个连接时才建立一个新的连接。当连接关闭时,它会返回到池中,并在该池中保持与数据库的连接,而不是完全断开该 TCP 连接。

    当您完成连接后,请务必关闭它们。无论任何人对 Microsoft .NET Framework 中的垃圾收集有何评论,当您完成连接后,请务必在连接上显式调用 Close 或 Dispose。不要相信公共语言运行时 (CLR) 会为您清理和关闭连接。 CLR 最终将销毁该类并强制关闭连接,但您无法保证对象上的垃圾回收何时真正发生。

    要以最佳方式使用连接池,需要遵守一些规则。首先,打开连接,完成工作,然后关闭连接。如果必须,可以在每个请求上多次打开和关闭连接,而不是保持连接打开并通过不同的方法传递它。其次,使用相同的连接字符串(如果您使用集成身份验证,则使用相同的线程标识)。如果您不使用相同的连接字符串,例如根据登录用户自定义连接字符串,您将无法获得与连接池提供的相同优化值。而且,如果您在模拟大量用户的同时使用集成身份验证,那么您的池化效果也会大大降低。

    .NET CLR 数据性能计数器在尝试跟踪与连接池相关的任何性能问题时非常有用。

    http://msdn.microsoft.com/en-us/magazine/cc163854.aspx

    【讨论】:

    • @Robert,很好的答案,但我希望你能添加一个快速的代码示例,显示一个“使用”语句来打开(然后处理)连接。
    【解决方案2】:

    如果你使用下面的语法,只要留下 using 块,dispose 方法就会被调用,即使发生异常。

    using(SqlConnection connection = new SqlConnection())
    {
        // Work with connection object here.
    }
    
    //connection object gets disposed here.
    

    【讨论】:

      【解决方案3】:

      不确定这是否完全相关,但我刚接手一个项目,发现原来的编程团队没有做一些非常重要的事情。

      当你有一个 SQLConnection 时,我们称它为 conn,你可以这样做:

      conn.Open();
      

      然后执行一些 SQL 语句,无论是选择、插入还是更新。它完全有可能失败。所以当然,你应该这样做:

      try { conn.Open() } 
      catch (SqlException ex) 
       { 
             //do your logging/exception handling 
       }
      

      但是,人们忘记添加 finally 块。

      finally {
             if (conn.State == System.Data.ConnectionState.Open)
               conn.Close();
      }
      

      您要确定是否存在连接未保持打开的异常,因此请确保将其关闭。

      【讨论】:

      • 首选方法是将 conn 放在 using() {} 语句中。使用或不使用池化。
      • 同意,但为什么要在关闭连接之前检查连接是否打开?为什么不关闭它,我相信这不会出错。
      • 你是对的,你可以直接关闭它而不检查它是否打开。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 2018-07-13
      • 1970-01-01
      • 2019-01-03
      相关资源
      最近更新 更多