我的PHP / MS Sql Server 2005 / win 2003应用程序有时变得非常无响应,内存/ cpu使用率不会达到峰值。如果我尝试从sql Management Studio中打开任何新连接,则它只会挂在“打开连接”对话框中。如何确定活动连接总数(ms sql server 2005)
我的PHP / MS Sql Server 2005 / win 2003应用程序有时变得非常无响应,内存/ cpu使用率不会达到峰值。如果我尝试从sql Management Studio中打开任何新连接,则它只会挂在“打开连接”对话框中。如何确定活动连接总数(ms sql server 2005)
Answers:
这显示每个数据库的连接数:
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,并且该数字不代表实际的连接。
sysadmin
所需的角色(编辑评论)救了我的臀部。假设我的烫发正确,我会一直得到1。!修复并解决。赢:money_with_wings:
如@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
如果您的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
SELECT
[DATABASE] = DB_NAME(DBID),
OPNEDCONNECTIONS =COUNT(DBID),
[USER] =LOGINAME
FROM SYS.SYSPROCESSES
GROUP BY DBID, LOGINAME
ORDER BY DB_NAME(DBID), LOGINAME