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