SQL Server如何判斷哪些會話/連線是長連線?

潇湘隐者發表於2024-06-06

一般資料庫中可能存在長連線或短連線會話。長連線是相對於通常的短連線而說的,也就是長時間保持客戶端與服務端的連線狀態。如果不從應用程式入手,如何判斷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;

相關文章