最大用户连接数

seb*_*eid 25 sql-server max-connections sql-server-2012 connections

在 SQL Server 2012 标准版中,我知道最大用户连接数是 32,767。如果我正朝着这个数字前进,作为 DBA 我应该怎么做?

目前有 30,000 个用户连接,这个数字预计还会增加。

在此处输入图片说明

Han*_*non 33

跨 SQL Server 版本和版本的最大连接数为 32,767。

您可以通过查看以下内容来确定 SQL Server 当前有多少连接:

SELECT ConnectionStatus = CASE WHEN dec.most_recent_sql_handle = 0x0 
        THEN 'Unused' 
        ELSE 'Used' 
        END
    , CASE WHEN des.status = 'Sleeping' 
        THEN 'sleeping' 
        ELSE 'Not Sleeping' 
        END
    , ConnectionCount = COUNT(1)
FROM sys.dm_exec_connections dec
    INNER JOIN sys.dm_exec_sessions des ON dec.session_id = des.session_id
GROUP BY CASE WHEN des.status = 'Sleeping' 
        THEN 'sleeping' 
        ELSE 'Not Sleeping' 
        END
    , CASE WHEN dec.most_recent_sql_handle = 0x0 
        THEN 'Unused' 
        ELSE 'Used' 
        END;
Run Code Online (Sandbox Code Playgroud)

如果上述查询中已使用和未使用的连接之间的比率令人担忧,则连接池可能是由连接到服务器的客户端应用程序启用的,并且这些连接没有得到有效使用。您可能希望让开发人员修改这些应用程序的连接字符串以限制连接池的大小,并确保他们正确处理连接。如果未正确处理连接,则只要客户端应用程序正在运行,它们就会保持打开状态。

如果您感觉特别狂热,并且需要清除所有最近未执行任何操作的连接(无论它们当前是否实际正在执行工作),您可以运行以下代码,这将生成一个会话列表可以被杀死。您需要将生成的命令复制并粘贴到新的 SSMS 窗口中才能实际运行这些命令。我还建议您更新简历以防万一

DECLARE @cmd NVARCHAR(MAX);
SET @cmd = '';
SELECT @cmd = @cmd +
    CASE WHEN @cmd = '' THEN '' ELSE CHAR(13) + CHAR(10) END
    + 'KILL ' + CONVERT(VARCHAR(MAX), dec.session_id) + ';'
FROM sys.dm_exec_connections dec
WHERE dec.most_recent_sql_handle = 0x0;

PRINT @cmd;
Run Code Online (Sandbox Code Playgroud)

通过跨多个 SQL Server 节点对数据进行分片,可以线性扩展超过 32,767 的连接数。但是,在我看来,使用分片作为绕过连接数限制的方法类似于使用原子弹杀死蜘蛛。它杀死蜘蛛,但最终你可能会遇到更大的问题。更不用说构建原子弹非常困难,更不用说正确实施分片了。


swa*_*eck 12

我过去在连接池方面遇到过奇怪的行为,而您的场景与其中一种情况非常吻合。如果您的应用程序正在使用连接池(这仍然是猜测,在这一点上,直到您确认或否认),那么您将有许多连接保持打开状态。这是设计使然。

连接池旨在减少创建数据库连接的开销。举个例子,连接池为 3。据我所知,生命周期是这样的(从冷连接池缓存开始):

  1. 应用程序用户 A 请求连接到数据库
  2. 连接池启动到数据库的连接线程1
  3. 应用程序用户 B 请求连接到数据库
  4. 连接池启动连接线程2到数据库
  5. 应用程序用户 A 关闭他们的连接...到连接池
  6. 应用程序用户 C 请求连接到数据库
  7. sp_reset_connection线程 1 上的连接池问题
  8. 连接池将线程 1 分配给应用程序用户 C

这过于简单化,但要点包括:

  • 连接池线程池和数据库之间的连接将保持打开状态,直到数据库或连接池强行关闭连接
  • 连接在最后一个会话执行上下文中保持打开状态,直到该线程被另一个用户重新使用,此时sp_reset_connection将调用该线程。

这是我用来得出这些结论的参考资料。

SQL Server DBA 的连接池

孤交易案例