如何确定ms sql server 2005中打开/活动连接的总数

我的PHP / MS Sql Server 2005 / win 2003应用程序偶尔会变得非常没有响应,内存/ CPU使用率不会激增。 如果我尝试从SQLpipe理工作室打开任何新的连接,那么它只是挂在打开的连接对话框。 如何确定ms sql server 2005的活动连接总数

这显示了每个DB的连接数量:

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”angular色(否则它将只显示一行,结果计数为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可以在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 

使用它来获得每个连接池的准确计数(假定每个用户/主机进程使用相同的连接string)

 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连接,那么您可能知道,您的应用程序的数据库代码有问题。 应该在使用和使用连接池之后释放/configuration这些连接。 在这里看一个关于这个话题的体面的文章…

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