SqlConnection的Dispose方法会影响连接池吗?

8
据我所知,.Net默认情况下会对具有相同连接字符串的SqlConnection对象进行池化。如果我调用Dispose方法,连接是否仍将被池化?
这个问题是在ASP.NET应用程序的上下文中提出的,该应用程序有时会在单个PageLoad事件中对数据库进行多次访问。我希望连接被池化,但想确认一旦数据操作完成后关闭和释放连接是否会干扰.NET处理连接池的方式。
3个回答

11
使用连接池时,关闭SqlConnection仅告诉连接池你已经完成了它的使用。连接池会决定是真正关闭该连接还是重用它。
来自MSDN文档:
如果 SqlConnection 超出范围,它将不会被关闭。因此,必须通过调用 Close 或 Dispose 显式关闭连接。Close 和 Dispose 在功能上是等价的。如果连接池值 Pooling 设置为 true 或 yes,则返回底层连接到连接池中。另一方面,如果 Pooling 设置为 false 或 no,则关闭与服务器的基础连接。

3

SQL Server 连接池 上的 MSDN 文档称:

当连接被关闭或处置时,它们将会被释放回池中。

并且

我们强烈建议您在完成使用连接后始终关闭连接,以便将连接返回到池中。您可以使用 Connection 对象的 Close 或 Dispose 方法来实现这一点...

此外,连接池会确定是否从池中删除连接。

连接池将在长时间空闲后或检测到与服务器的连接已断开后,从池中移除连接。


1
据我所知,.Net将池化SqlConnection对象。
不,SQL提供程序将池化与SQL Server的基础连接(根据连接字符串分别进行池化)。
当调用Open时,SqlConnection对象将获得一个池化连接(或根据配置创建一个新连接等,是否有可用的池化连接),并在调用Close或Dispose时释放该连接。
这两个概念(SqlConnection对象和实际连接到SQL Server)是不同的,但显然有些相关。

关于你的第一个观点,这也是我所想的,但我在我的回答中指向的MSDN文档似乎有歧义:“创建池时,会创建多个连接对象并添加到池中,以满足最小池大小要求”,以及“当请求SqlConnection对象时,如果有可用的连接,则从池中获取”?我认为这是误导性的,因为它与文档中之前的一些观点相矛盾。 - Pero P.
@cpedros - 是的,我认为这有误导性-它混淆了“连接对象”(模糊的底层连接)和“SqlConnection对象” - SqlConnection是托管对象,您可以创建10000个,所有这些对象都共享一个Max Pool=100的连接字符串。当您尝试同时打开所有这些对象时,它将失败。 - Damien_The_Unbeliever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接