日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一次 Druid 连接池泄露引发的血案!

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一次 Druid 连接池泄露引发的血案! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近某個應用程序老是卡,需要重啟才能解決問題,導致被各種投訴,排查問題是?Druid 連接池泄露引發的血案。。

異常日志如下:

ERROR?-?com.alibaba.druid.pool.GetConnectionTimeoutException:?wait?millis?60000,?active?50,?maxActive?50,?creating?0at?com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1512)at?com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1255)at?com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5007)at?com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680)at?com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5003)at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1233)at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225)at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90)

連接池中的連接數量已經到達最大值了,到了 60 秒還不能創建連接就超時報錯了。

問題很明顯,肯定是應用程序哪里用了連接但沒有釋放,全局排查代碼又比較艱難,加了三個 Druid 連接池配置項,最終定位并解決了問題。

添加以下配置:

<!--?是否打開強制回收連接功能?--> <property?name="removeAbandoned"?value="true"?/><!--?超時時間,單位:毫秒?--> <property?name="removeAbandonedTimeoutMillis"?value="600000"/><!--?連接回收時是否記錄日志?--> <property?name="logAbandoned"?value="true"?/>

這就是連接泄露配置項,如果連接長時間不歸還,removeAbandoned?打開狀態,超過?removeAbandonedTimeoutMillis?設置的超時時間,將會強制回收連接。

連接池初始化時會啟動一個線程,用于檢查并回收連接。

參考源碼:

com.alibaba.druid.pool.DruidDataSource#createAndStartDestroyThread

當?logAbandoned?打開狀態時,關閉連接同時會記錄當時的堆棧日志,可用于定位到哪些代碼打開了連接沒關閉。

abandon?connection,?owner?thread:?https-jsse-nio-4443-exec-9,?connected?at?:?1573521883837,?open?stackTraceat?java.lang.Thread.getStackTrace(Thread.java:1589)at?com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1305)at?com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4619)at?com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680)at?com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4615)at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225)at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1217)at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90)at?org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:162)...

這個配置項雖然可用于排查連接池釋放問題,但生產環境小心使用,如果有的業務執行事務的時間比較長,會被誤回收,小心引發另外一個血案。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的一次 Druid 连接池泄露引发的血案!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。