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

时间:2013-01-29 17:13:08

标签: c# ado.net connection-pooling

不关闭Web应用程序中的连接会产生什么影响?

根据我的理解,如果你的池中有100个连接,如果你没有关闭你的连接,并且连接上的超时相当高,那么这就是幕后发生的事情:

  1. 打开连接从池中获取连接
  2. 如果你不关闭它,它将保持打开直到超时到期,然后一些后台线程将循环通过池并显式关闭/返回连接回池。
  3. 即使管理了c#,但这并不意味着它会在页面请求结束后为您关闭内容吗?这是超时设置的权利吗? 或者.net运行时是否足够聪明,知道自页面请求结束后,连接可以关闭?

    这是真的吗?

2 个答案:

答案 0 :(得分:0)

连接池意味着当您关闭(或处置您的连接)时,它实际上并未关闭,它只是返回到池中。这样可以再次重复使用连接。

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

垃圾收集器会在某个时刻拾取未处理的连接并将其丢弃,但是你永远不会知道什么时候它没有确定性。

Sql Connections是一种有限的资源,您应该尽快关闭它们,以确保不会耗尽池中的连接

答案 1 :(得分:0)

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

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

    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