1、可能標題說的很不明白,其實就是這樣一個情況,一個工程項目錯誤日志出現GetConnectionTimeoutException: wait millis 90000, active 22000的異常,如下:
2、最先想到的是提高數據庫本身的最大連接數,查看一下數據庫連接數是否過小,平衡一下工程的使用量級別和並發級別,其中查詢數據庫的小語句如下:
select value as processes_max from v$parameter where name ='processes'; --數據庫允許的最大連接數 結果4000
select count(*) as process_now from v$process; --當前進程連接數
select value as session_max from v$parameter where name ='sessions'; --數據庫最大session數
select count(*) as session_now from v$session; --當前的session連接數
select count(*) as active_now from v$session where status='ACTIVE'; --並發連接數
3、但是當把數據庫最大連接數也調整到合理的數字了,並且druid的基本配置也是沒有什么毛病,這個可以網上搜索,有很多druid的常規配置文章參考。如果還有連接數不夠的異常出現,這就要考慮是否程序本身存在沒有回收的連接數、會話數等開支,日積月累在某個時刻,比如訪問量高峰達到了飽和。那么可以添加druid的配置來幫助你監測,哪里沒有回收。
<!-- 超過時間限制是否回收 --> <property name="removeAbandoned" value="true" /> <!-- 超時時間;單位為秒。180秒=3分鍾 --> <property name="removeAbandonedTimeout" value="180" /> <!-- 關閉abanded連接時輸出錯誤日志 --> <property name="logAbandoned" value="true" />
4、這回注意抓取和分析日志,如下
5、結果進入具體的java類排查代碼,發現存在session沒有回收的問題。解決掉。