我怀疑我的Web应用程序有连接泄漏(获取超时和最大连接已达到错误)。所以我想监视池中活动的数据库连接数。我正在使用SQL Express,因此我没有一些帮助指南中建议的用户连接性能计数器。
我发现我也可以使用Win 2008服务器的性能监视器,但我不知道该怎么做。任何指南都将不胜感激。
答案 0 :(得分:24)
使用简单的
SELECT * FROM sys.dm_exec_connections
或强>
如果您需要其他数据,请尝试并采用此脚本
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 :(得分:10)
这将为每个用户提供每个数据库的连接数:
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NumberOfConnections,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
;
答案 2 :(得分:4)
您可以执行内置存储过程
exec sp_who
exec sp_who2