我知道如果我实例化一个 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 ms
如果连接真正关闭,第二次和第三次运行也应该是 300 毫秒。但我知道连接并没有真正关闭那些运行(我检查了 SQL Server 的活动监视器)。执行身份验证/等不需要额外的 200 毫秒。
如何强制连接真正关闭?
想法
- CommandBehavior.CloseConnection 有效吗?(显然不是?)
- 在连接字符串中设置“Max Pool Size = 0”是否有效?(这将是一个昂贵的解决方案)
- Dispose() 有效吗?
参考
- 关于连接池的文章
- 这是另一个告诉我们Close() 并没有真正关闭连接。
- 一篇关于连接池的优缺点的文章