Как определить общее количество открытых / активных подключений в ms sql server 2005


мой PHP/MS Sql Server 2005/win 2003 приложение иногда становится очень не отвечает,использование памяти / процессора не всплеск. Если я попытаюсь открыть любое новое соединение из SQL management studio, то он просто зависает в диалоговом окне открыть соединение. как определить общее количество активных подключений ms sql server 2005

7 80

7 ответов:

Это показывает количество соединений на каждую БД:

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

и это дает итого:

SELECT 
    COUNT(dbid) as TotalConnections
FROM
    sys.sysprocesses
WHERE 
    dbid > 0

Если вам нужно больше деталей, запустите:

sp_who2 'Active'

Примечание: используемая учетная запись SQL Server нуждается в роли "sysadmin" (в противном случае она просто покажет одну строку и количество 1 в результате)

Как упоминалось в @jwalkerjr, вы должны избавляться от соединений в коде (если пул соединений включен, они просто возвращаются в пул соединений). Предписанный способ сделать это-использовать '':

// Execute stored proc to read data from repository
using (SqlConnection conn = new SqlConnection(this.connectionString))
{
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "LoadFromRepository";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@ID", fileID);

        conn.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
            if (rdr.Read())
            {
                filename = SaveToFileSystem(rdr, folderfilepath);
            }
        }
    }
}

Я знаю, что это старый, но подумал, что было бы неплохо обновить. Если требуется точный подсчет, то столбец ECID, вероятно, также должен быть отфильтрован. SPID с параллельными потоками может отображаться несколько раз в sysprocesses и фильтрация ECID=0 вернет основной поток для каждого SPID.

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses with (nolock)
WHERE 
    dbid > 0
    and ecid=0
GROUP BY 
    dbid, loginame

используйте это, чтобы получить точное количество для каждого пула соединений (при условии, что каждый пользователь / хост-процесс использует одну и ту же строку подключения)

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

Если ваше приложение PHP держит открытыми многие соединения SQL Server, то, как вы можете знать, у вас есть проблема с кодом базы данных вашего приложения. Он должен освобождать / утилизировать эти соединения после использования и использования пула соединений. Посмотрите здесь приличную статью по этой теме...

http://www.c-sharpcorner.com/UploadFile/dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx

посмотреть процедуры sp_who это дает вам больше деталей, чем просто видеть количество подключений

в вашем случае я бы сделал что-то вроде этого

 DECLARE @temp TABLE(spid int , ecid int, status varchar(50),
                     loginname varchar(50),   
                     hostname varchar(50),
blk varchar(50), dbname varchar(50), cmd varchar(50), request_id int) 
INSERT INTO @temp  

EXEC sp_who

SELECT COUNT(*) FROM @temp WHERE dbname = 'DB NAME'

MS SQL knowledge based-как узнать открытые подключения к базе данных SQL и занят на каком хосте.

используя ниже запрос вы найдете список базы данных, имя хоста и общее количество открытых подсчетов соединения, на основе которого у вас будет идея, какой хост занял SQL-соединение.

SELECT DB_NAME(dbid) as DBName, hostname ,COUNT(dbid) as NumberOfConnections
FROM sys.sysprocesses with (nolock) 
WHERE dbid > 0 
and len(hostname) > 0 
--and DB_NAME(dbid)='master' /* Open this line to filter Database by Name */
Group by DB_NAME(dbid),hostname
order by DBName