2013-10-16 34 views
0

我正在java企業應用程序中工作。該應用程序具有用於後端的hibernate框架。由於應用程序的最近更改,某些代碼將消耗來自weblogic服務器的所有JDBC連接池。Hibernate應用程序中的連接泄漏

應用程序連接是在代碼中處理的屬性,對於我們使用threadlocal類創建每個會話的每個線程。所以創建連接沒有問題。該應用程序已超過5年。

我們懷疑最近的代碼更改導致這個主要問題。最後我們決定使用profiler工具來調查這個問題。

在此之前,我將回顧最近的代碼更改,那麼在審查時我需要在休眠時記住哪些關鍵點?

這是非常關鍵/嚴重的情況。所以建議我一些提示,以解決這個..

感謝

+0

您可以使用像[HikariCP](http://brettwooldridge.github.io/HikariCP/)這樣的連接池,並打開泄漏檢測,該漏洞檢測應指出代碼中連接被分配的位置,並且永遠不會返回。 – brettw

回答

2

通常,這是由於未關閉的會話。我個人使用的簡單方法是創建運行會話的表格(地圖)。在創建時在表格中添加條目,並在會話關閉時刪除(或標記)地圖上的條目。通過這種方式,您可以確定哪些會話未關閉。

好記錄器(slf4/log4j)也可能有用,特別是NDC(http://wiki.apache.org/logging-log4j/NDCvsMDC)。

0

查詢數據庫:

select * from pg_stat_activity; 

並檢查其查詢長着idle in transaction狀態持續。嘗試在你的代碼中找到它們,並研究爲什麼事務沒有完成。


添加到persistence.xml

<property name="hibernate.c3p0.unreturnedConnectionTimeout" value="60"/> 
    <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces" value="true"/> 

unreturnedConnectionTimeout值應大於0,因爲默認爲0 - 無限制。這些屬性是更多的測試/調試目的,理想情況下不應用於生產環境。


幾項檢查的代碼/配置:

  • 提交事務明示或使用@Transactional。請注意0​​只適用於公共方法。

  • 如果您使用的是Hibernate 5.1.0.Final,那麼就是持久性。XML應包含:

<property name="hibernate.connection.provider_class" value="org.hibernate.c3p0.internal.C3P0ConnectionProvider" />

相反的:

<property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />

  • 如果您使用

<property name="hibernate.enable_lazy_load_no_trans" value="true" />

延遲加載時可能會導致連接泄漏。相關討論:


檢查相關文章: