【问题标题】:How to determine total number of open/active connections in ms sql server 2005如何确定 ms sql server 2005 中打开/活动连接的总数
【发布时间】:2008-10-19 04:27:32
【问题描述】:

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

【问题讨论】:

    标签: sql-server database sql-server-2005 connection


    【解决方案1】:

    这显示了每个 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' 角色(否则它只会显示一行并且结果为 1)

    【讨论】:

    • 非常感谢您。对于像我这样的新手,启动 SQL Server Management Studio,右键单击您的数据库,选择 New Query,将其粘贴并单击“!Go”按钮。
    • 这既不应该被接受,也不应该被最高投票的答案,因为它根本不正确。如果您以sa 登录,则只能依赖返回的号码。如果您以非 sa 用户身份登录,您将看到 1,这并不代表实际连接。
    • @ajeh:暗示您有足够的权限来执行任务。您的评论是多余的。
    • @MitchWheat 建议在您的回答中评论,要获得 SQL Server 的实际/所有连接,用于运行此脚本的帐户需要“系统管理员”权限。
    • @IEBasara:这是隐含的。为什么您希望非管理员能够查看此类信息?
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

      正如@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 连接(并且所有引用都会在页面循环结束时被丢弃),但可能请求者正在使用持久连接,这需要智能连接重复使用。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果您的 PHP 应用程序打开了许多 SQL Server 连接,那么您可能知道,您的应用程序的数据库代码存在问题。它应该在使用和使用连接池后释放/处理这些连接。在此处查看有关该主题的体面文章...

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

        【讨论】:

          【解决方案6】:

          请参阅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'
          

          【讨论】:

            【解决方案7】:

            基于 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
            

            【讨论】:

              【解决方案8】:
              SELECT
              [DATABASE] = DB_NAME(DBID), 
              OPNEDCONNECTIONS =COUNT(DBID),
              [USER] =LOGINAME
              FROM SYS.SYSPROCESSES
              GROUP BY DBID, LOGINAME
              ORDER BY DB_NAME(DBID), LOGINAME
              

              【讨论】:

                猜你喜欢
                • 2012-12-21
                • 1970-01-01
                • 1970-01-01
                • 2023-03-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-10
                • 2010-11-17
                相关资源
                最近更新 更多