Tomcat JDBC池–连接泄漏–捕获罪魁祸首
數(shù)據(jù)庫(kù)連接泄漏是可以隱藏的東西,除非特別注意,否則將在系統(tǒng)高峰期最關(guān)鍵的階段暴露出來。 我們將手動(dòng)檢查所有打開的連接是否已正確關(guān)閉。 然后,我們將提供各種代碼質(zhì)量插件來進(jìn)行掃描和檢查。 當(dāng)連接通過復(fù)雜的程序結(jié)構(gòu)傳遞時(shí),這兩個(gè)都可能會(huì)丟失可能的連接泄漏。 然后在單元測(cè)試或集成測(cè)試級(jí)別,我們可以進(jìn)行檢查以驗(yàn)證連接池中的計(jì)數(shù),以避免這種不幸的情況,這種情況會(huì)使工程師在年末或黑色星期五忙,等等:)
在不幸的情況下,由于性能下降或整個(gè)系統(tǒng)崩潰(可通過JDBC連接泄漏傳播),當(dāng)我們懷疑連接泄漏時(shí),如何輕松而Swift地找出罪魁禍?zhǔn)住?在Tomcat連接池中,我們可以使用3個(gè)屬性來完成此操作。
removeAbandoned
如果數(shù)據(jù)庫(kù)連接已被放棄(一段時(shí)間未使用,但尚未返回到池中),則此配置將嘗試刪除它。 以下配置配置了刪除連接之前要等待的時(shí)間。
removeAbandonedTimeout
在嘗試刪除連接之前,它將花費(fèi)的時(shí)間。 默認(rèn)情況下為60s。
注意:當(dāng)我們將此屬性與目標(biāo)一起使用來隔離罪魁禍?zhǔn)讜r(shí),了解系統(tǒng)將在數(shù)據(jù)庫(kù)上執(zhí)行的最長(zhǎng)事務(wù)所花費(fèi)的平均時(shí)間很有用。 將此值設(shè)置為比該值大得多的值將避免我們捕獲可能實(shí)際上在做有用工作的無(wú)辜線程,最后將被適當(dāng)?shù)仃P(guān)閉。
logAbandoned
以此來控制“刪除刪除的連接時(shí)是否應(yīng)記錄堆棧跟蹤”。
有關(guān)這些屬性的更多詳細(xì)信息,請(qǐng)參見
https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes
如果您懷疑應(yīng)用程序是否有泄漏,這些配置也可以用作安全網(wǎng)。 因?yàn)樗鼘⒆詣?dòng)刪除已忘記關(guān)閉的連接,并且池將進(jìn)行處理以適當(dāng)考慮這些,從而保持預(yù)期的最小,最大和空閑連接數(shù)。
這是我在池中刪除廢棄連接時(shí)捕獲的示例日志。
[ 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)您可以在此處捕獲與廢棄連接創(chuàng)建相關(guān)的整個(gè)堆棧跟蹤,這將使我們更快地找到問題的根源。
(可選)我們還可以選擇使用JConsole通過JMX監(jiān)視JDBC池。 為此,我們需要啟用屬性“ jmxEnabled' ,該屬性將允許從Jconsole連接到JDBC池。 完成后,它具有監(jiān)視池的許多功能,甚至可以設(shè)置為在檢測(cè)到連接被放棄時(shí)發(fā)出通知。
希望這可以幫助您節(jié)省一些時(shí)間進(jìn)行故障排除。
干杯!
翻譯自: https://www.javacodegeeks.com/2020/04/tomcat-jdbc-pool-connection-leak-catch-the-culprit.html
總結(jié)
以上是生活随笔為你收集整理的Tomcat JDBC池–连接泄漏–捕获罪魁祸首的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pin设置是啥意思(什么是设置PIN)
- 下一篇: junit runner_了解JUnit