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

问题描述 投票:0回答:9

我的 PHP/MS Sql Server 2005/win 2003 应用程序有时会变得非常无响应,内存/CPU 使用率不会飙升。如果我尝试从 sql management studio 打开任何新连接,那么它只会挂在打开的连接对话框中。 如何确定 MS sql server 2005 的活动连接总数

sql-server database sql-server-2005 connection
9个回答
305
投票

这显示了每个数据库的连接数:

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)


8
投票

使用它来获取每个连接池的准确计数(假设每个用户/主机进程使用相同的连接字符串)

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

7
投票

正如@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);
            }
        }
    }
}

5
投票

我知道这是旧的,但认为更新是个好主意。如果需要准确的计数,则可能还应该过滤列 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

1
投票

如果您的 PHP 应用程序打开了许多 SQL Server 连接,那么您可能知道,您的应用程序的数据库代码存在问题。它应该在使用后释放/处置这些连接并使用连接池。看看这里关于这个主题的一篇不错的文章......

http://www.c-sharpcorner.com/UploadFile/dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx


0
投票

参见 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'

0
投票

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

0
投票
SELECT
[DATABASE] = DB_NAME(DBID), 
OPNEDCONNECTIONS =COUNT(DBID),
[USER] =LOGINAME
FROM SYS.SYSPROCESSES
GROUP BY DBID, LOGINAME
ORDER BY DB_NAME(DBID), LOGINAME

0
投票

Glenn Barry 的 IP 连接(查询 39)也非常有帮助。

SELECT ec.client_net_address, es.[program_name], es.[host_name], es.login_name, 
COUNT(ec.session_id) AS [connection count] 
FROM sys.dm_exec_sessions AS es WITH (NOLOCK) 
INNER JOIN sys.dm_exec_connections AS ec WITH (NOLOCK) 
ON es.session_id = ec.session_id 
GROUP BY ec.client_net_address, es.[program_name], es.[host_name], es.login_name  
ORDER BY ec.client_net_address, es.[program_name] OPTION (RECOMPILE);
© www.soinside.com 2019 - 2024. All rights reserved.