如何查找连接池中使用连接的内容

Chr*_*ris 10 .net c# debugging ado.net connection-pooling

我在使用.NET编写的代码中遇到了问题.

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

超时已过期.从池中获取连接之前经过的超时时间.这可能是因为所有池连接都在使用中并且达到了最大池大小.

我知道这是因为某个地方我没有处理过我的一个datareader或类似的东西,这意味着它仍然打开了连接,因此它不会被返回到池中.我在我的代码中发现这种情况时遇到了一些问题.

所以我的问题:

有没有办法查询连接池,以找出它正在使用的连接正在做什么.我只是想找到一种方法来查找正在运行的查询以允许我找到有问题的代码片段.

对于它的价值,我没有权限在相关数据库上运行活动监视器以找出这种方式.

Con*_*rix 12

有没有办法查询连接池,以找出它正在使用的连接正在做什么.

不,不是.连接池是您的应用程序维护的(实际上是a 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 .....
Run Code Online (Sandbox Code Playgroud)

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

解决此问题的最佳方法是使用ADO.NET性能计数器对您的应用程序进行概要分析,并密切关注NumberOfReclaimedConnections并进行全面的代码审查.

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

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