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 窗口中才能实际运行这些命令。我还建议您更新简历以防万一。
Run Code Online (Sandbox Code Playgroud)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;
通过跨多个 SQL Server 节点对数据进行分片,可以线性扩展超过 32,767 的连接数。但是,在我看来,使用分片作为绕过连接数限制的方法类似于使用原子弹杀死蜘蛛。它会杀死蜘蛛,但最终你可能会遇到更大的问题。更不用说构建原子弹非常困难,更不用说正确实施分片了。
swa*_*eck 12
我过去在连接池方面遇到过奇怪的行为,而您的场景与其中一种情况非常吻合。如果您的应用程序正在使用连接池(这仍然是猜测,在这一点上,直到您确认或否认),那么您将有许多连接保持打开状态。这是设计使然。
连接池旨在减少创建数据库连接的开销。举个例子,连接池为 3。据我所知,生命周期是这样的(从冷连接池缓存开始):
sp_reset_connection线程 1 上的连接池问题这过于简单化,但要点包括:
sp_reset_connection将调用该线程。这是我用来得出这些结论的参考资料。
| 归档时间: |
|
| 查看次数: |
57087 次 |
| 最近记录: |