2012-01-05 32 views
17

我懷疑我的Web應用程序有連接泄漏(獲取超時和最大連接到達錯誤)。所以我想監視池中有多少數據庫連接處於活動狀態。我正在使用SQL Express,因此我沒有用戶連接性能計數器,如某些幫助指南中的建議。如何監視SQL Server中的活動連接池?

我確實發現我也可以使用Win 2008服務器的性能監視器,但我不知道如何去做。任何指南,將不勝感激。

回答

23

使用簡單

SELECT * FROM sys.dm_exec_connections 

OR

嘗試和採用這個腳本的情況下,如果你需要一些其他的數據

declare @now datetime 
set  @now = getdate() 
set nocount off 
select p.spid      as spid 
    , rtrim(p.loginame)   as SQLUser 
    , rtrim(p.nt_username)  as NTUser 
    , rtrim(p.nt_domain)   as NTDomain 
    , rtrim(case 
     when p.blocked <> 0 then 'BLOCKED' 
     else p.status 
     end)      as status 
    , case 
     when p.blocked is null or p.blocked = 0 then ''  
     else convert(varchar(10),p.blocked) 
     end       as BlockedBySpid 
    , rtrim(p.cmd)    as CurrentCommand 
    , case when p.dbid = 0 then '' else rtrim(db_name(p.dbid)) end as DBName 
    , isnull(rtrim(p.program_name),'')  as ProgramName 
    , cast(cast(p.waittype as int) as nvarchar(10)) as CurrentWaitType 
    , p.waittime    as CurrentWaitTime 
    , p.lastwaittype    as LastWaitType 
    , rtrim(p.waitresource)  as LastWaitResource 
    , p.open_tran     as OpenTransactionCnt 
    , p.cpu      as CPUTime 
    , convert(bigint, p.physical_io) as DiskIO 
    , p.memusage     as MemoryUsage 
    , p.hostprocess    as HostProcess 
    , rtrim(p.hostname)   as HostName 
    , p.login_time    as LoginTime 
    , p.last_batch    as LastBatchTime 
    , p.net_address    as NetAddress 
    , ltrim(rtrim(p.net_library)) as NetLibrary 
    , case 
     when lower(p.status) not in ('sleeping', 'background', 'dormant', 'suspended') 
     or  p.open_tran > 0 
     or  p.blocked > 0 
     or  upper(ltrim(rtrim(p.cmd))) like 'WAITFOR%' 
     then 'Y' 
     else 'N' 
     end       as Active 
    , case 
     when p.net_address <> '' -- Non system processes 
     and  p.program_name not like 'SQLAgent - %' 
     then 'N' 
     else 'Y' 
     end       as SystemProcess 
    , case 
     when p.last_batch = '19000101'  then 'n/a' 
     when datediff(day,  p.last_batch, @now) > 2 then convert(varchar(10),datediff(day,  p.last_batch, @now)) + ' days' 
     when datediff(hour,  p.last_batch, @now) >= 4 then convert(varchar(10),datediff(hour,  p.last_batch, @now)) + ' hrs' 
     when datediff(minute, p.last_batch, @now) >= 10 then convert(varchar(10),datediff(minute, p.last_batch, @now)) + ' min' 
     else convert(varchar(10),datediff(second, p.last_batch, @now)) + ' sec' 
     end       as TimeSinceLastBatch 
    , p.kpid      as InternalKPID 
    , case  
     when (lower(p.status) in ('background', 'dormant') 
     and  p.open_tran <= 0 
     and  p.blocked <= 0 
     and  upper(ltrim(rtrim(p.cmd))) not like 'WAITFOR%' 
     ) or (
     lower(p.status) like '%sleeping%' 
     ) 
     then 0 
     else p.kpid 
     end       as kpid 
    , (convert(nvarchar,p.spid) + '.' + case  
             when (lower(p.status) in ('background', 'dormant') 
             and  p.open_tran <= 0 
             and  p.blocked <= 0 
             and  upper(ltrim(rtrim(p.cmd))) not like 'WAITFOR%' 
             ) or (
             lower(p.status) like '%sleeping%' 
             ) 
             then '0' 
             else convert(nvarchar,p.kpid) 
             end) + '.' + convert(nvarchar,convert(float, p.login_time)) as SessionLifeTimeKey     
    , convert(float, p.login_time) as 'LoginTimeFloatDiff' 
from sys.sysprocesses   p with (readpast) 
+1

當運行SELECT * FROM你在尋找sys.dm_exec_connections? – 2016-02-17 01:20:27

4

可以執行內置存儲過程

exec sp_who 
exec sp_who2 
+0

這些已被棄用,現在贊成奧列格的答案 – Liam 2016-08-10 08:19:27

5

這會給每個數據庫的連接數,每個用戶:

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections, 
    loginame as LoginName 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 
GROUP BY 
    dbid, loginame 
;