了解 ado.net 连接池,而不是关闭连接

本文关键字:连接 ado net 了解 | 更新日期: 2023-09-27 17:56:36

不关闭Web应用程序中的连接有什么后果?

据我了解,假设您的池中有 100 个连接,如果您不关闭连接,并且连接的超时相当高,这就是幕后发生的事情:

  1. 打开连接需要池中的连接
  2. 如果不关闭它,它将保持打开状态,直到超时到期,然后某个后台线程将循环访问池并显式关闭/将连接返回到池。

即使托管了 C#,这并不意味着它会在页面请求结束后为您关闭内容,正确吗? 这就是超时设置的用途吧? 或者 .net 运行时是否足够智能,知道由于页面请求结束,可以关闭连接?

这是真的吗?

了解 ado.net 连接池,而不是关闭连接

连接池意味着当您关闭(或处置连接)时,它实际上并没有关闭,它只是返回到池中。这允许再次重用连接。

任何实现IDisposable的托管对象都应该在 using 语句中使用(大多数都这样做,WCF 是一个明显的例外)。使用SqlConnection这会导致调用close,并允许重用连接。

垃圾回收器会在某个时候拾取未释放的连接并处理它,但你永远不会知道什么时候,因为它没有确定性。

Sql 连接是有限的资源,应尽快关闭它们,以确保池中的连接不会用完

始终建议显式关闭所有连接,以将其释放到连接池以供其他进程使用。

如果您有 SqlConnection 对象,则应在页面请求后释放该对象。这是因为 System.Web.UI.Page 和 SqlConnection 对象都实现了 IDisposable。完成对页面的请求后,将释放 Page 对象。释放 SqlConnection 对象时,将关闭连接。这就是为什么你看到 SqlConnection 对象的大多数用法都包含在 using 语句中:

    using (SqlConnection connection = new SqlConnection(
  "Integrated Security=SSPI;Initial Catalog=Northwind"))
    {
        connection.Open();      
        // Pool A is created.
    }

始终建议显式关闭它或使用 using 语句。

有关更多详细信息,请参阅此文章:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx