【问题标题】:How to find what is using the connections in my connection pool如何查找正在使用我的连接池中的连接的内容
【发布时间】:2011-07-06 15:33:08
【问题描述】:

我使用 .NET 编写的代码存在问题。

问题是我在某个地方有一些不可靠的数据库代码,这意味着一段时间后我会收到以下错误:

超时。超时时间 在获得一个之前经过 来自池的连接。这可能 已经发生,因为所有汇集 连接正在使用和最大池 已达到大小。

我知道这是因为我没有在某个地方处理我的数据读取器或类似的东西,这意味着它仍然打开连接,因此它没有被返回到池中。不过,我在查找代码中发生这种情况的位置时遇到了一些问题。

所以我的问题:

有什么方法可以查询连接池以了解其正在使用的连接在做什么。我只是在寻找一种方法来查找正在运行的查询,以便我找到有问题的代码。

无论如何,我无权在相关数据库上运行活动监视器来找出这种方法。

【问题讨论】:

  • 您使用的是哪个版本的框架?
  • 连接池是共享资源。遗憾的是,无法知道谁在使用该资源进行故障排除。 Connection.Open 应该是我们可以轻松拦截的东西,并在连接从池中取出和返回时跟踪它们,但到目前为止,我很难找到方法。也许 SignalFx 挂钩到 CLR(它会替换方法来跟踪查询)可以帮助解决这个问题。

标签: c# .net debugging ado.net connection-pooling


【解决方案1】:

有什么方法可以查询 连接池找出它是什么 正在使用的连接正在做。

没有。并不真地。连接池是您的应用程序维护的东西(实际上是 List<DbConnectionInternal>)您无法从那里了解该连接上发生的事情,或者哪个对象应该调用 Connection.Close(或 Dispose)。所以这没有帮助

如果幸运的话,您可以在池连接用完时遇到超时时执行 sp_who 或 sp_who2,但很可能大多数结果看起来像这样。

SPID Staus    Login Hostname  Blkby DBname Command          ....
---- -------  ----- --------- ----- ------ ---------------- 
79   sleeping uName WebServer .     YourDb AWAITING COMMAND .....
80   sleeping uName WebServer .     YourDb AWAITING COMMAND .....
81   sleeping uName WebServer .     YourDb AWAITING COMMAND .....
82   sleeping uName WebServer .     YourDb AWAITING COMMAND .....

这意味着是的,您的应用程序确实打开了很多连接并且没有关闭它们,甚至没有对它们做任何事情。

解决此问题的最佳方法是使用ADO.NET Performance Counters 分析您的应用程序,并密切关注NumberOfReclaimedConnections,并进行彻底的代码审查。

如果你真的很绝望,你可以在遇到这个问题时清除池。

using (SqlConnection cnn = new SqlConnection("YourCnnString"))
{

     try
     {
            cnn.Open();
     }
     catch (InvalidOperationException)
     {
             SqlConnection.ClearPool(cnn);
     }
     cnn.Open();

}

不过,我确实提醒您不要这样做,因为它可能会阻塞您的数据库服务器,因为它允许您的应用程序在资源耗尽之前打开服务器允许的尽可能多的连接。

【讨论】:

  • 谢谢康拉德。这似乎是一个非常全面的答案,并说出了我的怀疑。最后,我决定我对数据库访问的编写方式不满意,并最终完全对其进行了大修,但这对未来很有用,尤其是关于如何在监视窗口中找到连接池的指针。 :)
【解决方案2】:

您是否尝试过加载 SSMS 并在相关数据库上运行 sp_who2

USE [SomeDatabase]
EXEC sp_who2

这应该会及时向您显示正在发生的事情。

【讨论】:

  • 刚刚尝试过(如果您想更正错字,请使用 sp_who2),但它只返回了我当前的连接。我尝试更改我的连接以使用与相关代码相同的连接设置,但仍然只显示我的一行,这似乎是我当前的连接。我认为这是阻止我运行活动监视器的相同权限问题。 :( 不过感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2017-06-02
  • 2013-05-17
  • 2016-09-02
  • 1970-01-01
  • 2017-06-30
相关资源
最近更新 更多