Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在我的连接池中查找正在使用的连接_C#_.net_Debugging_Ado.net_Connection Pooling - Fatal编程技术网

C# 如何在我的连接池中查找正在使用的连接

C# 如何在我的连接池中查找正在使用的连接,c#,.net,debugging,ado.net,connection-pooling,C#,.net,Debugging,Ado.net,Connection Pooling,我使用.NET编写的代码中有一个问题 问题是,在某个地方,我有一些不可靠的数据库代码,这意味着经过一段时间后,我会出现以下错误: 超时已过期。超时时间 在获得 来自池的连接。今年五月 已发生,因为所有 连接正在使用,最大池数 尺寸已达到 我知道这是因为在某个地方我没有处理我的一个DataReader或类似的东西,这意味着它仍然有打开的连接,所以它不会返回到池中。但是,在我的代码中,我发现在哪里发生了这种情况,有点困难 因此,我的问题是: 是否有任何方法可以查询连接池,以了解其正在使用的连接在做什

我使用.NET编写的代码中有一个问题

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

超时已过期。超时时间 在获得 来自池的连接。今年五月 已发生,因为所有 连接正在使用,最大池数 尺寸已达到

我知道这是因为在某个地方我没有处理我的一个DataReader或类似的东西,这意味着它仍然有打开的连接,所以它不会返回到池中。但是,在我的代码中,我发现在哪里发生了这种情况,有点困难

因此,我的问题是:

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


无论如何,我没有权限在所讨论的数据库上运行活动监视器以找到这种方法。

您是否尝试过加载SSM并在所讨论的数据库上运行
sp_who2

USE [SomeDatabase]
EXEC sp_who2
这应该能让你及时了解此刻发生了什么

有没有办法查询这个问题 连接池以了解其功能 正在使用的连接正在运行

不,不是真的。连接池是您的应用程序维护的东西(实际上是一个
列表
),如果您确实想要,您可以通过反射或通过本地或监视窗口(见下文)调试池中的连接,但您无法从那里了解该连接上发生了什么,或者哪个对象应该调用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 .....
这意味着你的应用程序确实打开了很多连接,没有关闭它们,甚至没有对它们做任何事情

解决这一问题的最佳方法是分析您的应用程序,使用并密切关注
numberofreceivedconnections
,同时进行彻底的代码审查

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

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

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

}

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

刚刚尝试过(如果您想更正键入错误,请参阅sp_who2),但它只返回了我当前的连接。我尝试更改我的连接以使用与问题代码相同的连接设置,但仍然只显示了我的一行,而这一行似乎是我当前的连接。我假设这与阻止我运行活动监视器的权限问题相同:(感谢您的建议。您使用的是什么版本的框架?连接池是一个共享资源。遗憾的是,无法知道谁正在使用该资源进行故障排除。连接。打开应该是我们可以轻松拦截的东西,并在连接从池中取出和返回池时跟踪连接,但到目前为止,我很抱歉很难找到方法。可能是SignalFx钩住了CLR(它会替换方法来跟踪查询)这可能会有所帮助。谢谢Conrad。这似乎是一个非常全面的答案,并说明了我的怀疑。最后我决定我对数据库访问的编写方式不满意,并最终对其进行了彻底的修改,但这对未来很有用,特别是关于如何在watch windo中找到连接池的指针w、 :)