我知道,如果实例化一个SqlConnection对象,我实际上是从连接池中获取了一个连接。当我调用Open()方法时,它将打开该连接。如果我在该SqlConnection对象上调用Close()或Dispose()方法,则会将其返回到连接池。
但是,这并没有告诉我它是否真的关闭了,还是我仍然拥有对数据库的活动连接。
我如何强制关闭网络级别的SqlConnection,或者至少知道何时它关闭?
示例:
using(SqlConnection conn = new SqlConnection(DBConnString)) {
conn.Open();
SqlCommand cmd = conn.CreateCommand();
...
cmd.ExecuteReader(CommandBehavior.CloseConnection);
...
}
- 第一次运行:300毫秒
- 第二次运行:100毫秒
- 第三次运行:100毫秒
- 长时间等待(30分钟)后:300毫秒
如果连接真正关闭,第二和第三次运行也应该是300毫秒。但我知道对于这些运行,连接并没有真正关闭(我检查了SQL Server的活动监视器)。它不需要额外的200ms来执行身份验证/等操作。
我该如何强制连接真正关闭?
想法
- CommandBehavior.CloseConnection是否有效?(显然不行?)
- 在连接字符串中设置“Max Pool Size = 0”是否有效?(这将是一个无补偿的解决方案)
- Dispose()是否有效?
参考资料
- 有关连接池的文章
- 这里是另一篇文章,告诉我们Close()并没有真正关闭连接。
- 有关连接池的利弊的文章