我们有一个似乎有连接泄漏的应用程序(sql Server表示已达到最大池大小).我独自在我的开发机器上(很明显),只是通过导航应用程序,我触发了这个错误. sql Server活动监视器使用我的数据库显示大量进程.
我想找到哪些文件打开连接但不使用它.我正在考虑使用像grep这样的东西,为每个文件计算“.Open()”的数量和“.Close()”的数量,并获得数字不相等的文件.
这是现实的吗?
加分问题:sql Server活动监视器中找到的进程是否与连接相对应?如果没有,我如何找出我的数据库中打开了多少个连接?
该应用程序在asp.net(vb)3.5,与sql Server 2005.我们目前不使用LINQ(尚未)或类似的东西.
谢谢
解决方法
查看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进行调试,如以下文章中所述:
> How to troubleshoot leaked SqlConnection Objects Part 1
> How to troubleshoot leaked SqlConnection Objects Part 2
如果您需要有关如何使用windbg的更多信息,这些文章是一个很好的介绍:
> Getting Started with WinDBG Part 1
> Getting Started with WinDBG Part 2