Answers:
的 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;
如果要考虑上述查询中已使用和未使用的连接之间的比率,则很可能连接到服务器的客户端应用程序启用了连接池,并且这些连接没有得到有效利用。您可能希望开发人员修改这些应用程序的连接字符串,以限制连接池的大小,并确保它们正确处理了连接。如果未正确处理连接,则只要客户端应用程序正在运行,它们就会保持打开状态。
如果您感到特别狂躁,并且需要摆脱最近没有执行任何操作的所有连接(无论它们当前是否正在执行工作),则可以运行以下代码,这将生成会话列表,可以被杀死 您需要将生成的命令复制并粘贴到新的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以上。但是,在我看来,使用分片来绕开连接数量限制的方法类似于使用原子弹杀死蜘蛛。它会杀死蜘蛛,但最终您可能会遇到更大的问题。更不用说制造原子弹相当困难,更不用说正确实施工具分片了。
is_user_process
限定符是一个好主意,当然排除不包含last_request_start_time
最近的会话也不会受到损害。最近多久?另一个好问题。
过去,我在连接池方面遇到了奇怪的行为,您的情况与其中一种情况非常吻合。如果您的应用程序正在使用连接池(目前仍在推测,直到您确认或拒绝),然后您将有许多连接保持打开状态。这是设计使然。
连接池旨在减少创建数据库连接的开销。让我们以一个3的连接池为例,据我所知,生命周期是这样的(从一个冷的连接池缓存开始):
sp_reset_connection
线程1上的连接池问题这过于简单了,但是要点包括:
sp_reset_connection
将调用该线程。这是我用来得出这些结论的参考资料。