【问题标题】:Understanding ado.net connection pools, not closing connections了解 ado.net 连接池,而不是关闭连接
【发布时间】:2013-01-29 17:13:07
【问题描述】:
在 Web 应用程序中不关闭连接会有什么后果?
据我了解,假设您的池中有 100 个连接,如果您不关闭连接,并且连接超时相当高,这就是幕后发生的事情:
- 打开连接从池中获取连接
- 如果您不关闭它,它将保持打开状态,直到超时到期,然后一些后台线程将循环通过池并显式关闭/返回连接池。
虽然 c# 是托管的,但这并不意味着它会在页面请求正确结束后为你关闭东西?这就是超时设置的目的吗? 或者 .net 运行时是否足够聪明,可以知道自从页面请求结束后,连接可以关闭?
这是真的吗?
【问题讨论】:
标签:
c#
ado.net
connection-pooling
【解决方案1】:
连接池意味着当您关闭(或处置您的连接)时,它实际上并没有关闭,它只是返回到池中。这允许重新使用连接。
任何实现IDisposable 的托管对象都应该在 using 语句中使用(大多数情况下,WCF 是一个明显的例外)。对于SqlConnection,这会导致调用关闭,并允许重新使用连接。
垃圾收集器会在某个时候拾取未处理的连接并处理它,但你永远不知道什么时候,因为它不是确定性的。
Sql Connections 是一种有限的资源,你应该尽快关闭它们,以确保你不会用完池中的连接
【解决方案2】:
始终建议您明确关闭所有连接以将它们释放到连接池以供其他进程使用。
如果你有一个SqlConnection 对象,它应该在页面请求之后被释放。这是因为 System.Web.UI.Page 和 SqlConnection 对象都实现了 IDisposable。当对 Page 的请求完成时,Page 对象被 Disposed。释放 SqlConnection 对象时,连接将关闭。这就是为什么您会在 using 语句中看到大多数 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