一般数据库中可能存在长连接或短连接会话。长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。如果不从应用程序入手,如何判断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_time, getdate()) as connect_duration_min
from sys.dm_exec_connections c
inner 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_time, getdate()) >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;