Мое приложение 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)
Этот ответ не должен быть ни принятым, ни получившим наибольшее количество голосов, поскольку он просто неверен. Вы можете полагаться на возвращенный номер только в том случае, если вы вошли в систему как sa. Если вы вошли в систему как пользователь, не являющийся пользователем sa, вы увидите 1, и это не будет соответствовать фактическим соединениям.
@ajeh: подразумевается, что у вас достаточно прав для выполнения задачи. Ваш комментарий лишний.
@MitchWheat В своем ответе рекомендуется прокомментировать, что для получения фактических / всех подключений к SQL Server учетной записи, используемой для запуска этого сценария, требуется разрешение «системного администратора».
@ IEBasara: это неявно. Почему вы ожидаете, что неадминистратор сможет просматривать такую информацию?
Поздно к вечеринке .. но .. требуемая роль sysadmin (редактировать комментарий) спасла мою задницу. Я продолжал получать 1 при условии, что у меня была правильная химическая завивка. Уф! фиксированный и совмещенный. выиграть: money_with_wings:
Если ваше приложение PHP удерживает открытыми многие подключения к SQL Server, то, как вы, возможно, знаете, у вас проблема с кодом базы данных вашего приложения. Он должен освобождать / удалять эти соединения после использования и использовать пул соединений. Поищите здесь достойную статью по этой теме ...
http://www.c-sharpcorner.com/UploadFile/dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx
Как упоминалось в @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);
}
}
}
}
Спрашивающий упомянул, что они использовали PHP, поэтому пример кода может им не подходить. Сборщик мусора должен автоматически очищать непостоянные подключения к SQL Server, когда на них больше нет ссылок (и все ссылки будут удалены в конце цикла страницы), но, возможно, запрашивающий использует постоянные подключения, что требует интеллектуального подключения повторное использование.
см. 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
Я знаю, что это старый, но подумал, что было бы неплохо обновить его. Если требуется точный подсчет, вероятно, следует также отфильтровать 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
SELECT
[DATABASE] = DB_NAME(DBID),
OPNEDCONNECTIONS =COUNT(DBID),
[USER] =LOGINAME
FROM SYS.SYSPROCESSES
GROUP BY DBID, LOGINAME
ORDER BY DB_NAME(DBID), LOGINAME
Замечательное большое спасибо. Для таких новичков, как я, запустите SQL Server Management Studio, щелкните правой кнопкой мыши свою базу данных, выберите «Новый запрос», вставьте его и нажмите кнопку «! Перейти».