連接池已滿,超過最大連接數 解決方案


昨天遇到一個案例,一個同事在通過其中一台數據庫客戶端(暫且名為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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM