代码改变世界

SQL Server如何判断哪些会话/连接是长连接?

2024-06-06 08:50  潇湘隐者  阅读(269)  评论(0编辑  收藏  举报

一般数据库中可能存在长连接或短连接会话。长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。如果不从应用程序入手,如何判断SQL Server数据库中哪些会话是长连接呢?

在SQL Server中有连接与会话的概念,一般而言,连接是物理概念,而会话则是逻辑上的概念。两者是对同一件事情不同层次的描述。简单讲,连接(Connection)是物理上的客户端同服务器的通信链路,会话(Session)是逻辑上的用户同服务器的通信交互。例如,在你的电脑上,使用SSMS客户端工具连接数据库,你可以开启多个会话,而连接只有一个。那么我们要判断长连接短连接,就必须使用连接的登陆时间,而不是会话的登陆时间。在SQL Server中sys.dm_exec_sessions中的login_time表示建立会话的时间,而DMV视图sys.dm_exec_connections中的connect_time表示建立连接时的时间戳,所以要你判断数据库的连接是长连接还是短连接,就可以使用sys.dm_exec_connections中的connect_time字段,假设一个连接建立超过5分钟(这个值可以根据实际情况或要求调整),就判断为长连接,那么可以使用下面SQL来查询

select s.login_name
     , s.host_name
     , c.client_net_address
  , c.local_net_address
  , c.connect_time
  , s.session_id
  , datediff(mi, connect_timegetdate()) as connect_duration_min 
from sys.dm_exec_connections c
left join sys.dm_exec_sessions s on c.session_id =s.session_id
where c.session_id > 50 and c.local_net_address is not null
    and datediff(mi, connect_timegetdate())  >5
order by connect_duration_min;

统计长连接的设备/终端的信息

select distinct c.client_net_address,
       (select host_name from sys.dm_exec_sessions s where s.session_id = c.session_id) as host_name  
from sys.dm_exec_connections c
where c.session_id > 50 and c.local_net_address is not null
    and datediff(mi, c.connect_time, getdate())  >5
order by client_net_address,host_name;