Как контролировать активный пул соединений в SQL Server? - программирование
Подтвердить что ты не робот

Как контролировать активный пул соединений в SQL Server?

Я подозреваю, что у моего веб-приложения есть утечки соединения (получение таймаута и максимальное подключение достигли ошибки). Поэтому я хотел контролировать, сколько подключений к базе данных активно в пуле. Я использую SQL Express, поэтому у меня нет счетчика производительности User Connections, как это предлагается в некоторых справочниках.

Я обнаружил, что также могу использовать Performance Monitor для сервера Win 2008, но я не знаю, как это сделать. Любое руководство по этому вопросу будет оценено.

4b9b3361

Ответ 1

Используйте простой

SELECT * FROM sys.dm_exec_connections

ИЛИ

Попробуйте принять этот script в случае, если вам нужны другие данные

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)

Ответ 2

Это даст количество подключений на базу данных для каждого пользователя:

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

Ответ 3

Вы можете выполнить встроенную хранимую процедуру

exec sp_who
exec sp_who2