Как определить общее количество открытых / активных соединений в MS SQL Server 2005
-
03-07-2019 - |
Вопрос
Мой PHP / MS Sql Server 2005 / win 2003 Приложение иногда перестает отвечать на запросы, использование памяти / процессора не увеличивается. Если я пытаюсь открыть любое новое соединение из студии управления sql, то оно просто висит в диалоговом окне открытого соединения. Как определить общее количество активных соединений MS SQL Server 2005
Решение
Здесь показано количество соединений на каждую БД:
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, вы должны избавляться от соединений в коде (если пул соединений включен, они просто возвращаются в пул соединений). Предписанный способ сделать это - использовать инструкцию using
:
// 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 с параллельными потоками может появляться несколько раз в системных процессах, и фильтрация 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 - Как узнать, какие соединения открыты с базой данных 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