Tomcat JDBC池–连接泄漏–捕获罪魁祸首
數據庫連接泄漏是可以隱藏的東西,除非特別注意,否則將在系統高峰期最關鍵的階段暴露出來。 我們將手動檢查所有打開的連接是否已正確關閉。 然后,我們將提供各種代碼質量插件來進行掃描和檢查。 當連接通過復雜的程序結構傳遞時,這兩個都可能會丟失可能的連接泄漏。 然后在單元測試或集成測試級別,我們可以進行檢查以驗證連接池中的計數,以避免這種不幸的情況,這種情況會使工程師在年末或黑色星期五忙,等等:)
在不幸的情況下,由于性能下降或整個系統崩潰(可通過JDBC連接泄漏傳播),當我們懷疑連接泄漏時,如何輕松而Swift地找出罪魁禍首。 在Tomcat連接池中,我們可以使用3個屬性來完成此操作。
removeAbandoned
如果數據庫連接已被放棄(一段時間未使用,但尚未返回到池中),則此配置將嘗試刪除它。 以下配置配置了刪除連接之前要等待的時間。
removeAbandonedTimeout
在嘗試刪除連接之前,它將花費的時間。 默認情況下為60s。
注意:當我們將此屬性與目標一起使用來隔離罪魁禍首時,了解系統將在數據庫上執行的最長事務所花費的平均時間很有用。 將此值設置為比該值大得多的值將避免我們捕獲可能實際上在做有用工作的無辜線程,最后將被適當地關閉。
logAbandoned
以此來控制“刪除刪除的連接時是否應記錄堆棧跟蹤”。
有關這些屬性的更多詳細信息,請參見
https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes
如果您懷疑應用程序是否有泄漏,這些配置也可以用作安全網。 因為它將自動刪除已忘記關閉的連接,并且池將進行處理以適當考慮這些,從而保持預期的最小,最大和空閑連接數。
這是我在池中刪除廢棄連接時捕獲的示例日志。
[ 2020 - 04 - 24 00 : 26 : 13 , 229 ] WARN {org.apache.tomcat.jdbc.pool.ConnectionPool} - Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection @5ab91385 ]:java.lang.Exception at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java: 1096 ) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java: 799 ) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java: 648 ) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java: 200 ) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java: 128 ) at org.lanka.carbon.user.core.jdbc.JDBCUserStoreManager.getDBConnection(JDBCUserStoreManager.java: 1187 ) at org.lanka.sample.CustomUserStoreManager.doAuthenticate(CustomUserStoreManager.java: 51 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.authenticateInternal(AbstractUserStoreManager.java: 674 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.access$ 100 (AbstractUserStoreManager.java: 86 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 4 .run(AbstractUserStoreManager.java: 542 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 4 .run(AbstractUserStoreManager.java: 539 ) at java.security.AccessController.doPrivileged(Native Method) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.authenticate(AbstractUserStoreManager.java: 539 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.authenticateInternal(AbstractUserStoreManager.java: 702 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.access$ 100 (AbstractUserStoreManager.java: 86 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 4 .run(AbstractUserStoreManager.java: 542 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 4 .run(AbstractUserStoreManager.java: 539 ) at java.security.AccessController.doPrivileged(Native Method) at org.lanka.carbon.user.core.common.AbstractUserStoreManager.authenticate(AbstractUserStoreManager.java: 539 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 3 .run(AbstractUserStoreManager.java: 522 ) at org.lanka.carbon.user.core.common.AbstractUserStoreManager$ 3 .run(AbstractUserStoreManager.java: 514 ) at java.security.AccessController.doPrivileged(Native Method)您可以在此處捕獲與廢棄連接創建相關的整個堆棧跟蹤,這將使我們更快地找到問題的根源。
(可選)我們還可以選擇使用JConsole通過JMX監視JDBC池。 為此,我們需要啟用屬性“ jmxEnabled' ,該屬性將允許從Jconsole連接到JDBC池。 完成后,它具有監視池的許多功能,甚至可以設置為在檢測到連接被放棄時發出通知。
希望這可以幫助您節省一些時間進行故障排除。
干杯!
翻譯自: https://www.javacodegeeks.com/2020/04/tomcat-jdbc-pool-connection-leak-catch-the-culprit.html
總結
以上是生活随笔為你收集整理的Tomcat JDBC池–连接泄漏–捕获罪魁祸首的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pin设置是啥意思(什么是设置PIN)
- 下一篇: 手机图库怎么设置密码(华为手机图库怎么设