昨天遇到一個案例,一個同事在通過其中一台數據庫客戶端(暫且名為B機器)連接訪問 服務器上的DB ,所有對象(表,視圖,存儲過程)都打不開,提示連接池已滿,超過最大連接數.
這個錯誤比較奇怪,難道同時有32767個並發連接,於是遠程登錄服務器,打開數據庫,發現打開表,存儲過程 都沒問題.於是判斷是不是他們程序中沒有顯示釋放連接,
查后發現不是程序的問題,用下面方法查看后發現有389個數據庫客戶端連接,程序連接才100多個,很奇怪為什么會有300多個數據庫客戶端連接,
再查這些連接的IP和機器名發現來自B.於是到B上查看,最后發現有4個遠程界面,並且每個遠程界面都有N個查詢窗口連接 服務器上的DB,到這找到了問題的根源.
最后把這些連接都關閉后,再在B上打開服務器上的DB 就沒有問題了.
通過這個案例 建議大家:
1、能夠將使用后的連接及時關閉,這樣有效的減小了無用的連接,同時也避免了以上的情況.
2、避免無權限的用戶登錄上來誤操作的發生.
3、不要做無意義的“收藏”。
4、同一個數據庫客戶端不要打開過多的連接,避免出現異常。
需要說明的是:不確定 SQL 2008是否有這個限制,統一客戶端不能同時打開389個連接,在網上也沒有查到相關資料。
下面將我查詢有多少個 連接及來自那些IP 的SQL 共享給大家。
---查看當前數據庫系統所有請求情況.我只列出了我認為比較重要有助於我解決問題的字段。 SELECT ds.session_id, ds.status, Db_name(dr.database_id) AS database_name, ds.login_name, ds.login_time, ds.host_name, dc.client_net_address, dc.client_tcp_port, ds.program_name, dr.cpu_time, dr.reads, dr.writes, dc.num_reads, dc.num_writes, ds.client_interface_name, ds.last_request_start_time, ds.last_request_end_time, dc.connect_time, dc.net_transport, dc.net_packet_size, dr.start_time, dr.status, dr.command, dr.blocking_session_id, dr.wait_type, dr.wait_time, dr.last_wait_type, dr.wait_resource, dr.open_transaction_count, dr.percent_complete, dr.granted_query_memory FROM Sys.dm_exec_requests dr WITH(nolock) RIGHT OUTER JOIN Sys.dm_exec_sessions ds WITH(nolock) ON dr.session_id = ds.session_id RIGHT OUTER JOIN Sys.dm_exec_connections dc WITH(nolock) ON ds.session_id = dc.session_id WHERE ds.session_id > 50 ORDER BY ds.program_name ----用戶連接數 SELECT login_name, Count(0) user_count FROM Sys.dm_exec_requests dr WITH(nolock) RIGHT OUTER JOIN Sys.dm_exec_sessions ds WITH(nolock) ON dr.session_id = ds.session_id RIGHT OUTER JOIN Sys.dm_exec_connections dc WITH(nolock) ON ds.session_id = dc.session_id WHERE ds.session_id > 50 GROUP BY login_name ORDER BY user_count DESC