我明白,如果我实例化一个SqlConnection对象,我真的抓住从连接池中的连接。 当我调用open(),它会打开连接。 如果我调用SqlConnection对象的关闭()或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工作? (显然不是?)
- 是否设置“最大池大小= 0”在连接字符串的工作? (这将是一个得不偿失溶液)
- 是否Dispose()方法的工作?
参考
- 文章连接池
- 这里是另外一个它告诉我们, 关闭()并不真正关闭连接。
- 上一篇文章优劣连接池
也许SqlConnection.ClearPool
?
萌西斯科的回答(呼叫SqlConnection.ClearPool
)是正确的。
有时你需要非常接近,而不是连接池的回报。 举个例子,我有一个创建一个临时数据库,构建模式,测试一些东西,一个单元测试,然后删除数据库从无到有如果测试全部通过。
当连接池是活动的,DROP DATABASE命令失败,因为还是有活动的连接。 但从程序员的点的所有SQLConnections被关闭,但由于池仍持有一个开放的,SQL Server将不允许下降。
连接池是如何处理的最好的文档上的SQL Server连接池此页面上MSDN。 人们不希望关闭连接池完全是因为它反复打开和关闭提高性能,但有时你需要调用上的SQLConnection“强制关闭”,这样就会让数据库去。
这与ClearPool完成。 如果调用SqlConnection.ClearPool(connection)
关闭/处置,当你做收盘前/处置它会真的走了。
如果你不想使用连接池,你必须在你指定它SqlConnection.ConnectionString
财产。 例如
"Data Source=MSSQL1;Database=AdventureWorks;Integrated Security=true;Pooling=false;"
处置或关闭SqlConnection
对象只是要关闭连接并返回到连接池。
一般情况下,你想连接池做的工作 - 你不想连接到真正的亲密。
具体为什么你要不要回连接池?
我看你使用的是.NET,但因为这在谷歌查询出现了让我给一个java回应...
使用实现可关闭(数据源),并调用close的数据源。 阿光支持可关闭。
CommandBehavior.CloseConnection
通常是沮丧,因为这个非常的事实-你不能肯定的是,连接将被关闭。 (我会尽力找到一些这方面的具体证据,我说这个从微弱的回忆)。
Dispose()
是最可靠的方式,因为它隐式调用Close()
。
在using
结构由@Alex证明是写的只是一个(编程型)方式try-finally
与对象的附加隐含处置施工。
编辑:(后编辑质疑)
您在实际关闭连接的担心似乎无端给我。 该连接将简单地返回到池中,以便它可以很容易,而不必去通过所有的初始化被重用。 这并不意味着该连接仍在积极地连接到数据库。
罗伯特的回答SqlConnection.ClearPool(TheSqlConn)
也正是我想要的。 这是很好的知道池可以用在必要时进行交互。
我的使用情况是:我们已经毁了一个连接,让它重新回到泳池,如何我们检测到它毁了,并刷新它,所以接下来用户将不会有问题。
解决的办法是:检测到我们刚才毁了连接,并从池中清除它完全,让池填满备份新鲜的连接。
十年写SqlClient.SqlConnection,我从来没有想过与池至今相互作用的。
文章来源: How to force a SqlConnection to physically close, while using connection pooling?