解决方法
跨sql Server版本和版本的
maximum number of connections是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;
如果涉及来自上述查询的已使用和未使用连接之间的比率,则很可能连接池由连接到服务器的客户端应用程序启用,并且这些连接未被有效使用.您可能希望让开发人员修改这些应用程序的连接字符串,以限制连接池的大小,并确保它们正确地处理连接.如果连接未正确处理,只要客户端应用程序正在运行,它们将保持打开状态.
如果您感觉特别狂热,并且需要摆脱最近没有执行任何操作的所有连接(无论它们当前是否正在执行工作),您可以运行以下代码,这将生成一个会话列表,可以被杀死.您需要将生成的命令复制并粘贴到新的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;
通过在多个sql Server节点之间分片数据,可以线性扩展超过32,767的连接数.但是,在我看来,使用分片作为绕过连接数限制的方法类似于使用原子弹杀死蜘蛛.它会杀死蜘蛛,但你可能会在一天结束时遇到更大的问题.更不用说制造原子弹非常难了,更不用说正确实现分片了.