什麼是最好的方式來找到我的Java代碼的哪一部分是打開數據庫連接,但沒有關閉它? 我困在一個很難調試此問題的大批處理過程中。 我正在使用JBOSS應用程序服務器。泄漏的數據庫連接
Q
泄漏的數據庫連接
2
A
回答
3
Findbugs有兩個規則,可能有幫助。我總是發現這些有用:
ODR:方法可能會失敗,關閉數據庫資源(ODR_OPEN_DATABASE_RESOURCE)
的方法創建一個數據庫資源(如數據庫連接 或行集),不將其分配給任何字段,將其傳遞給其他 方法,或將其返回,並且不會在方法外的所有 路徑上關閉對象。未能關閉所有方法中的所有 路徑上的數據庫資源可能會導致性能下降,並可能導致應用程序在與數據庫進行通信時出現問題。
ODR:方法可能會失敗,關閉數據庫資源上的異常(ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH)
的方法創建一個數據庫資源(如數據庫連接 或行集),不將其分配到任何領域,將它傳遞給其他的 方法,或將其返回,並且不會在方法外的所有異常路徑上關閉對象。未能在方法的所有路徑上關閉數據庫 資源可能會導致性能較差,並且可能導致應用程序在與數據庫進行通信時出現問題。
參考:
2
如果你不能通過代碼,我會建議老式的方式,添加一堆System.outs,並在out語句中提供詳細信息,可以幫助您找出連接何時打開。您可能能夠非常仔細地確定代碼的哪個部分正在執行該操作。至少,它可能會減少您需要關注的代碼量。
1
JBoss的數據源有一個永遠的標誌爲此
(從數據源的DTD):
<!-- Whether to check for unclosed statements when a
connection is returned to the pool and result sets are
closed when a statement is closed/return to the prepared
statement cache.
valid values are:
false - do not track statements and results
true - track statements and result sets and warn when they are not closed
nowarn - track statements but do no warn about them being unclosed (the default)
e.g.
<track-statements>nowarn</track-statements>
-->
所以你*-ds.xml
文件中你的元素設置爲true
,看服務器日誌之後。
相關問題
- 1. 數據庫連接泄漏
- 2. Tomcat的數據庫連接泄漏
- 3. 泄漏數據庫連接:PostgreSQL,SQLAlchemy,Flask
- 4. 連接泄漏
- 5. JDBC連接泄漏
- 6. 多租戶軟件中的WildFly/JPA數據庫連接泄漏
- 7. 檢測Azure Sql數據庫上的泄漏連接
- 8. 如何找到泄漏的數據庫連接池句柄?
- 9. 由jms異常引起的Glassfish數據庫連接泄漏
- 10. GoLang MongoDB的連接泄漏
- 11. NHibernate泄漏連接/事務
- 12. Apache HttpClient PoolingHttpClientConnectionManager泄漏連接?
- 13. 休眠連接泄漏
- 14. Subsonic 3.0.0.4泄漏SQL連接?
- 15. android:TextToSpeech泄漏服務連接
- 16. 連接泄漏問題Weblogic
- 17. DBCP Tomcat連接池泄漏
- 18. 服務連接泄漏
- 19. 休眠/ c3p0連接泄漏
- 20. 跟蹤連接泄漏
- 21. Android的數據庫泄漏發現
- 22. 使用AsyncTaskExecutor時項目讀取器中的數據庫連接泄漏
- 23. Joomla數據庫內存泄漏
- 24. android數據庫泄漏發現IllegalStateException
- 25. 此代碼中的LDAP連接泄漏
- 26. GlassFish中的連接泄漏監視
- 27. 在weblogic服務器泄漏的連接
- 28. C#中的連接泄漏DataBase.ExecuteScalar
- 29. Glassfish 3.0.1中的AJP連接泄漏
- 30. 莫名連接泄漏崩潰的webapp
一個分析器,它可以幫助你在尋找日益增長的東西也可以幫助。 – Alfabravo 2012-02-29 16:02:20