一般資料庫中可能存在長連接或短連接會話。長連接是相對於通常的短連接而說的,也就是長時間保持客戶端與服務端的連接狀態。如果不從應用程式入手,如何判斷SQL Server資料庫中哪些會話是長連接呢? 在SQL Server中有連接與會話的概念,一般而言,連接是物理概念,而會話則是邏輯上的概念。兩者是對同 ...
一般資料庫中可能存在長連接或短連接會話。長連接是相對於通常的短連接而說的,也就是長時間保持客戶端與服務端的連接狀態。如果不從應用程式入手,如何判斷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
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_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;