SQL Server如何判斷哪些會(huì)話/連接是長連接?
一般數(shù)據(jù)庫中可能存在長連接或短連接會(huì)話。長連接是相對(duì)于通常的短連接而說的,也就是長時(shí)間保持客戶端與服務(wù)端的連接狀態(tài)。如果不從應(yīng)用程序入手,如何判斷SQL Server數(shù)據(jù)庫中哪些會(huì)話是長連接呢?
在SQL Server中有連接與會(huì)話的概念,一般而言,連接是物理概念,而會(huì)話則是邏輯上的概念。兩者是對(duì)同一件事情不同層次的描述。簡單講,連接(Connection)是物理上的客戶端同服務(wù)器的通信鏈路,會(huì)話(Session)是邏輯上的用戶同服務(wù)器的通信交互。
例如,在你的電腦上,使用SSMS客戶端工具連接數(shù)據(jù)庫,你可以開啟多個(gè)會(huì)話,而連接只有一個(gè)。那么我們要判斷長連接短連接,就必須使用連接的登陸時(shí)間,而不是會(huì)話的登陸時(shí)間。
在SQL Server中sys.dm_exec_sessions中的login_time表示建立會(huì)話的時(shí)間,而DMV視圖sys.dm_exec_connections中的connect_time表示建立連接時(shí)的時(shí)間戳,所以要你判斷數(shù)據(jù)庫的連接是長連接還是短連接,就可以使用sys.dm_exec_connections中的connect_time字段,假設(shè)一個(gè)連接建立超過5分鐘(這個(gè)值可以根據(jù)實(shí)際情況或要求調(diào)整),就判斷為長連接,那么可以使用下面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;
統(tǒng)計(jì)長連接的設(shè)備/終端的信息
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;