【发布时间】:2019-01-28 07:48:48
【问题描述】:
我知道,如果我实例化一个 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 的活动监视器)。执行身份验证/等不需要额外的 200 毫秒。
如何强制连接真正关闭?
想法
- CommandBehavior.CloseConnection 是否有效? (显然不是?)
- 在连接字符串中设置“Max Pool Size = 0”是否有效? (这将是一个昂贵的解决方案)
- Dispose() 有效吗?
参考文献
- Connection Pooling上的文章
- 这是另一个告诉我们Close() doesn't really close 连接。
- pros and cons connection pooling上的一篇文章
【问题讨论】:
-
为什么连接真正关闭?性能低下?
标签: c# sql ado.net database-connection connection-pooling