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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
91
0
295 913
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

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

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)

Замечательное большое спасибо. Для таких новичков, как я, запустите SQL Server Management Studio, щелкните правой кнопкой мыши свою базу данных, выберите «Новый запрос», вставьте его и нажмите кнопку «! Перейти».

user1902431 14.12.2012 02:05

Этот ответ не должен быть ни принятым, ни получившим наибольшее количество голосов, поскольку он просто неверен. Вы можете полагаться на возвращенный номер только в том случае, если вы вошли в систему как sa. Если вы вошли в систему как пользователь, не являющийся пользователем sa, вы увидите 1, и это не будет соответствовать фактическим соединениям.

ajeh 15.10.2014 00:33

@ajeh: подразумевается, что у вас достаточно прав для выполнения задачи. Ваш комментарий лишний.

Mitch Wheat 15.10.2014 03:54

@MitchWheat В своем ответе рекомендуется прокомментировать, что для получения фактических / всех подключений к SQL Server учетной записи, используемой для запуска этого сценария, требуется разрешение «системного администратора».

IEBasara 28.10.2014 09:19

@ IEBasara: это неявно. Почему вы ожидаете, что неадминистратор сможет просматривать такую ​​информацию?

Mitch Wheat 28.10.2014 09:26

Поздно к вечеринке .. но .. требуемая роль sysadmin (редактировать комментарий) спасла мою задницу. Я продолжал получать 1 при условии, что у меня была правильная химическая завивка. Уф! фиксированный и совмещенный. выиграть: money_with_wings:

Pure.Krome 04.09.2015 05:15

Если ваше приложение 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, когда на них больше нет ссылок (и все ссылки будут удалены в конце цикла страницы), но, возможно, запрашивающий использует постоянные подключения, что требует интеллектуального подключения повторное использование.

Paul d'Aoust 18.07.2014 21:26

см. 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

Другие вопросы по теме