vel*_*koz 5 c# sql database database-connection sql-server-2008
我们目前手上有一点情况 - 似乎有人忘了在代码中关闭连接.结果是连接池相对快速耗尽.作为一个临时补丁,我们添加Max Pool Size = 500;到Web服务上的连接字符串,并在所有连接都用完后再循环池,直到我们弄明白这一点.
到目前为止,我们已经做到了:
SELECT SPId
FROM MASTER..SysProcesses
WHERE DBId = DB_ID('MyDb') and last_batch < DATEADD(MINUTE, -15, GETDATE())
Run Code Online (Sandbox Code Playgroud)
获得15分钟未使用的SPID.我们现在尝试使用该SPID获取上次执行的查询:
DBCC INPUTBUFFER(61)
Run Code Online (Sandbox Code Playgroud)
但显示的查询是多种多样的,这意味着关于连接操作的基础级别的某些内容被破坏,或者我们的推断是错误的......
我们的想法在这里有误吗?DBCC/sysprocesses是否给出了我们期望的结果,或者是否存在一些副作用?(例如,池中的连接影响?)
(请注意我们可以使用SQL找到的东西,因为执行代码的人很多而且现在不在场)
我预计输入缓冲区会“记住”无数不同的查询 - 根据失败的时间和运行的查询的种类,您似乎不太可能以这种方式看到一致的查询。回想一下,连接最终将被关闭,但只有当它们被 GC 并最终确定时。
正如 Mitch 所建议的,您需要在源代码中搜索打开的连接,并确保它们已本地化并包装在 using() 中。还要寻找可能保持连接的长期存在的对象。在我们的目录 ASP 页面对象的早期版本中,持有未正确管理的连接。
为了缩小范围,您可以在专注于应用程序的特定部分时监控连接计数(perfmon)吗?与报告或其他查询相比,这种情况在 CRUD 领域发生得更多吗?这可能有助于缩小您需要进行的源搜索范围。