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