2012-02-29 55 views
2

什麼是最好的方式來找到我的Java代碼的哪一部分是打開數據庫連接,但沒有關閉它? 我困在一個很難調試此問題的大批處理過程中。 我正在使用JBOSS應用程序服務器。泄漏的數據庫連接

+0

一個分析器,它可以幫助你在尋找日益增長的東西也可以幫助。 – Alfabravo 2012-02-29 16:02:20

回答

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,看服務器日誌之後。