当前位置:  开发笔记 > 后端 > 正文

如何在ASP.net应用程序中检测SqlServer连接泄漏?

如何解决《如何在ASP.net应用程序中检测SqlServer连接泄漏?》经验,为你挑选了2个好方法。

我目前正在ASP.net 2.0应用程序上进行一些GUI测试.RDBMS是SQL Server 2005.主机是Win Server 2003/IIS 6.0.

我没有应用程序的源代码,因为它是由一个没有发布代码的外部公司编写的.

我注意到当我重新启动IIS时应用程序运行良好但经过一些测试后,在我打开并关闭浏览器几个小时之后,应用程序开始变得越来越慢.我想知道这种行为是否是由于程序员关闭连接错误造成的:我怀疑这里的数据库是否存在开放连接泄漏.

我想.Net垃圾收集器最终将关闭它们但是......这可能需要一段时间,不是吗?

我有SQL Server Management Studio,我从活动监视器中注意到数据库上打开了很多连接.

从以上所述,以下是与主要问题相关的一些问题:

    有没有办法在SQL Server 2005中知道连接是否打开是因为它们等待在连接池中使用,或者它们是否因为应用程序使用它们而打开?

    somone是否知道良好的在线/纸质资源,我可以学习如何使用性能计数器或其他类型的工具来帮助追踪这类问题?

    如果性能计数器是最佳解决方案,那么我应该注意哪些变量?

小智.. 61

发现这个线程研究类似的问题.我想出了以下SQL作为调试SQL Server中漏洞连接的好方法:

SELECT S.spid, login_time, last_batch, status, hostname, program_name, cmd,
(
      select text from sys.dm_exec_sql_text(S.sql_handle)
) as last_sql
FROM sys.sysprocesses S
where dbid > 0
and DB_NAME(dbid) = ''
and loginame = ''
order by last_batch asc

这给你的是特定数据库和登录的所有开放连接,以及在该连接上执行的最后一个sql,按执行sql的时间排序.

由于连接池,您不能仅仅依赖于存在大量连接来告诉您连接泄漏的事实,因为连接池将保持连接,即使它们已从代码中正确关闭.但是,如果确实存在连接泄漏,您会看到某些连接变为"冻结" - 它们将显示在上述查询中,并且"last_batch"时间戳将永远不会更改.其他连接也会挂起,但每次在它们上运行新的sql时,"last_batch"时间戳都会更新.因此效果是冻结的连接将浮动到此查询的顶部.

如果您有相关应用程序的源代码,那么这将为您提供在孤立连接上执行的最后一个sql,这对于调试非常有价值.



1> 小智..:

发现这个线程研究类似的问题.我想出了以下SQL作为调试SQL Server中漏洞连接的好方法:

SELECT S.spid, login_time, last_batch, status, hostname, program_name, cmd,
(
      select text from sys.dm_exec_sql_text(S.sql_handle)
) as last_sql
FROM sys.sysprocesses S
where dbid > 0
and DB_NAME(dbid) = ''
and loginame = ''
order by last_batch asc

这给你的是特定数据库和登录的所有开放连接,以及在该连接上执行的最后一个sql,按执行sql的时间排序.

由于连接池,您不能仅仅依赖于存在大量连接来告诉您连接泄漏的事实,因为连接池将保持连接,即使它们已从代码中正确关闭.但是,如果确实存在连接泄漏,您会看到某些连接变为"冻结" - 它们将显示在上述查询中,并且"last_batch"时间戳将永远不会更改.其他连接也会挂起,但每次在它们上运行新的sql时,"last_batch"时间戳都会更新.因此效果是冻结的连接将浮动到此查询的顶部.

如果您有相关应用程序的源代码,那么这将为您提供在孤立连接上执行的最后一个sql,这对于调试非常有价值.



2> 小智..:

我遇到了这个问题,发现SQL Server Profiler是一个很棒的工具,我在一个简短的测试运行中监视了网站,并发现很多连接被创建(sp_who)没有被连接池重用,所以我只是打开了SQL Server Profiler和然后检查是否所有从代码发出的SP调用都跟着"sp_reset_connection"调用.如果在新批次开始之前没有呼叫,那么您只是缺少第一个连接.


注意在剖析器中缺少"sp_reset_connection"是一个很好的建议,谢谢!
推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有