如何强制一个SqlConnection到物理上接近,而使用连接池?(How to force a S

2019-06-26 05:52发布

我明白,如果我实例化一个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()方法的工作?

参考

  • 文章连接池
  • 这里是另外一个它告诉我们, 关闭()并不真正关闭连接。
  • 上一篇文章优劣连接池

Answer 1:

也许SqlConnection.ClearPool



Answer 2:

萌西斯科的回答(呼叫SqlConnection.ClearPool )是正确的。

有时你需要非常接近,而不是连接池的回报。 举个例子,我有一个创建一个临时数据库,构建模式,测试一些东西,一个单元测试,然后删除数据库从无到有如果测试全部通过。

当连接池是活动的,DROP DATABASE命令失败,因为还是有活动的连接。 但从程序员的点的所有SQLConnections被关闭,但由于池仍持有一个开放的,SQL Server将不允许下降。

连接池是如何处理的最好的文档上的SQL Server连接池此页面上MSDN。 人们不希望关闭连接池完全是因为它反复打开和关闭提高性能,但有时你需要调用上的SQLConnection“强制关闭”,这样就会让数据库去。

这与ClearPool完成。 如果调用SqlConnection.ClearPool(connection)关闭/处置,当你做收盘前/处置它会真的走了。



Answer 3:

如果你不想使用连接池,你必须在你指定它SqlConnection.ConnectionString财产。 例如

"Data Source=MSSQL1;Database=AdventureWorks;Integrated Security=true;Pooling=false;"

处置或关闭SqlConnection对象只是要关闭连接并返回到连接池。



Answer 4:

一般情况下,你想连接池做的工作 - 你不想连接到真正的亲密。

具体为什么你要不要回连接池?



Answer 5:

我看你使用的是.NET,但因为这在谷歌查询出现了让我给一个java回应...

使用实现可关闭(数据源),并调用close的数据源。 阿光支持可关闭。



Answer 6:

CommandBehavior.CloseConnection通常是沮丧,因为这个非常的事实-你不能肯定的是,连接将被关闭。 (我会尽力找到一些这方面的具体证据,我说这个从微弱的回忆)。

Dispose()最可靠的方式,因为它隐式调用Close()

using结构由@Alex证明是写的只是一个(编程型)方式try-finally与对象的附加隐含处置施工。

编辑:(后编辑质疑)

您在实际关闭连接的担心似乎无端给我。 该连接将简单地返回到池中,以便它可以很容易,而不必去通过所有的初始化被重用。 这并不意味着该连接仍在积极地连接到数据库。



Answer 7:

罗伯特的回答SqlConnection.ClearPool(TheSqlConn)也正是我想要的。 这是很好的知道池可以用在必要时进行交互。

我的使用情况是:我们已经毁了一个连接,让它重新回到泳池,如何我们检测到它毁了,并刷新它,所以接下来用户将不会有问题。

解决的办法是:检测到我们刚才毁了连接,并从池中清除它完全,让池填满备份新鲜的连接。

十年写SqlClient.SqlConnection,我从来没有想过与池至今相互作用的。



文章来源: How to force a SqlConnection to physically close, while using connection pooling?