我们有一个应用程序似乎存在连接泄漏(SQL Server 表示已达到最大池大小)。我独自一人在我的开发机器上(显然),只需导航应用程序,我就会触发此错误。 SQL Server 活动监视器显示大量正在使用我的数据库的进程。
我想查找哪些文件打开连接但不使用它。我正在考虑使用 grep 之类的东西,对于每个文件,计算“.Open()”的数量和“.Close()”的数量,并获取数字不相等的文件。
现实吗?
附加问题:SQL Server 活动监视器中找到的进程是否与连接相对应?如果没有,我如何知道我的数据库上打开了多少个连接?
该应用程序采用 asp.net (vb) 3.5 和 SQL Server 2005。我们目前尚未使用 LINQ 或类似的东西。
Thanks
从 SQL Server 端查看代码时,您可以运行以下查询来查看上次在休眠连接上运行的查询。 (打开不执行任何操作的连接)
SELECT ec.session_id, last_read, last_write, text, client_net_address, program_name, host_process_id, login_name
FROM sys.dm_exec_connections ec
JOIN sys.dm_exec_sessions es
ON ec.session_id = es.session_id
CROSS APPLY sys.dm_exec_sql_text(ec.most_recent_sql_handle) AS dest
where es.status = 'sleeping'
从应用程序端,您可以使用 sos.dll 进行调试,如以下文章所述:
- 如何对泄漏的 SqlConnection 对象进行故障排除第 1 部分 http://blogs.msdn.com/b/psssql/archive/2009/02/05/how-to-troubleshoot-leaked-sqlconnection-objects-net-2-0-part-1.aspx
- 如何对泄漏的 SqlConnection 对象进行故障排除第 2 部分 http://blogs.msdn.com/b/psssql/archive/2009/02/05/how-to-troubleshoot-leaked-sqlconnection-objects-net-2-0-part-2.aspx
如果您需要有关如何使用 Windbg 的更多信息,这些文章是很好的介绍:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)