在 Web 应用程序中不关闭连接有什么后果?
据我了解,假设您的池中有 100 个连接,如果您不关闭连接,并且连接超时相当高,这就是幕后发生的事情:
- 打开连接从池中获取连接
- 如果您不关闭它,它将保持打开状态,直到超时到期,然后一些后台线程将循环通过池并显式关闭/返回连接回池。
即使 c# 是托管的,但这并不意味着它会在页面请求正确结束后为您关闭东西?这就是超时设置的目的吗? 或者 .net 运行时是否足够聪明,可以知道自从页面请求结束后,可以关闭连接?
这是真的?
在 Web 应用程序中不关闭连接有什么后果?
据我了解,假设您的池中有 100 个连接,如果您不关闭连接,并且连接超时相当高,这就是幕后发生的事情:
即使 c# 是托管的,但这并不意味着它会在页面请求正确结束后为您关闭东西?这就是超时设置的目的吗? 或者 .net 运行时是否足够聪明,可以知道自从页面请求结束后,可以关闭连接?
这是真的?
连接池意味着当您关闭(或处置您的连接)时,它实际上并没有关闭,它只是返回到池中。这允许再次重新使用连接。
任何实现的托管对象都IDisposable
应该在 using 语句中使用(大多数情况下,WCF 是一个明显的例外)。SqlConnection
这样会导致调用关闭,并允许重新使用连接。
垃圾收集器会在某个时候拾取未处理的连接并处理它,但你永远不会知道什么时候,因为它不是确定性的。
Sql Connections 是一种有限的资源,您应该尽快关闭它们,以确保您不会用完池中的连接
始终建议您显式关闭所有连接以将它们释放到连接池以供另一个进程使用。
如果你有一个 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