Die*_*ero 32 sql-server asp.net connection-pooling performancecounter connection-leaks
我目前正在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) = '<my_database_name>'
and loginame = '<my_application_login>'
order by last_batch asc
Run Code Online (Sandbox Code Playgroud)
这给你的是特定数据库和登录的所有开放连接,以及在该连接上执行的最后一个sql,按执行sql的时间排序.
由于连接池,您不能仅仅依赖于存在大量连接来告诉您连接泄漏的事实,因为连接池将保持连接,即使它们已从代码中正确关闭.但是,如果确实存在连接泄漏,您会看到某些连接变为"冻结" - 它们将显示在上述查询中,并且"last_batch"时间戳将永远不会更改.其他连接也会挂起,但每次在它们上运行新的sql时,"last_batch"时间戳都会更新.因此效果是冻结的连接将浮动到此查询的顶部.
如果您有相关应用程序的源代码,那么这将为您提供在孤立连接上执行的最后一个sql,这对于调试非常有价值.
小智 7
我遇到了这个问题,发现SQL Server Profiler是一个很棒的工具,我在一个简短的测试运行中监视了网站,并发现很多连接被创建(sp_who)没有被连接池重用,所以我只是打开了SQL Server Profiler和然后检查是否所有从代码发出的SP调用都跟着"sp_reset_connection"调用.如果在新批次开始之前没有呼叫,那么您只是缺少第一个连接.
您始终可以从 web.config 检查连接字符串(主要是它们是否激活了连接池,是否启用了任何连接限制)。
另外,如果您使用的是 IIS 6,您可以将 Web 应用程序设置为使用单独的应用程序池,并设置其他选项来回收内存和进程。
关于性能计数器,您可以检查垃圾收集器运行了多长时间,应用程序使用了多少内存等。
如果您有权访问 sql server,则可以监视应用程序建立的连接(为每个已安装的 SQL Server 实例定义了性能计数器)。
MSDN 杂志上有一些文章。您还可以使用 SOS 调试库附加到应用程序的进程并手动检查它。
而且,如果您没有源代码,请尝试使用Reflector来获取应用程序的源代码(它们对于调试非常有用)
@稍后编辑:你也可以在 stackoverflow.com 上检查这个问题
归档时间: |
|
查看次数: |
25974 次 |
最近记录: |