2010-05-11 199 views
9

我們正在加載運行spring/hibernate/c3p0應用程序。當我將c3p0 maxPoolSize減少到遠遠低於併發用戶數時,我們的應用程序就會掛起。日誌中沒有錯誤消息,但它也不會繼續前進。休眠/ c3p0連接泄漏

我希望應用程序放慢速度,但不要完全停止。

這裏是我們的C3P0配置:

<bean id="coreDataSource" 
      class="com.mchange.v2.c3p0.ComboPooledDataSource" 
      destroy-method="close" 
      p:driverClass="${core.jdbc.driver}" 
      p:jdbcUrl="${core.jdbc.url}" 
      p:user="${core.jdbc.user}" 
      p:acquireIncrement="5"   
      p:acquireRetryAttempts="10" 
      p:acquireRetryDelay="5000" 
      p:initialPoolSize="52" 
      p:maxIdleTime="3600" 
      p:maxIdleTimeExcessConnections="300" 
      p:minPoolSize="52" 
      p:maxPoolSize="125" 
      p:numHelperThreads="6" 
      p:unreturnedConnectionTimeout="0"> 
      <property name="password"> 
       <bean class="com.docfinity.util.encryption.SpringStringDecrypter" 
        p:decryptFlag="${core.jdbc.decryptPasswordFlag}" 
        p:encryptedString="${core.jdbc.password}" /> 
      </property> 
    </bean> 

這將鎖住了,如果我在它拋出一個160級的用戶。

我試着將unreturnedConnectionTimeout設置爲正值(120秒),並查看了我們應用程序中顯示的堆棧跟蹤。堆棧跟蹤來自我們應用程序中的各種不同方法。這不像我們可以指出的一種方法,並說它正在泄漏連接。

任何幫助調試這個問題將不勝感激。

回答

10

我懷疑Hibernate或Spring是否在泄漏連接,我懷疑有一個配置問題讓你的應用程序運行我們的連接。這是我會做的:

  • 減少併發用戶數和池大小,我不知道問題是負載相關。

  • 設置unreturnedConnectionTimeout大於0結合debugUnreturnedConnectionStackTracestrue值來找出連接被檢查出,而不是返回到池中,並張貼了一些產生的堆棧跟蹤的。

  • 確定出現問題的一個業務流(一個用例場景),並在此場景中運行測試,直到找出問題。

另外,我會更新一個或兩個堆棧跟蹤的問題,也許有人會發現一些明顯的東西。

2

Hibernate和Spring並不是泄漏連接的東西,在你的應用程序的某個地方正在泄漏。我不確定C3P0,但BoneCP(http://jolbox.com)支持檢測未關閉的連接(併爲您打開它們的位置提供堆棧跟蹤)+會在線程中斷而沒有正確清理時關閉任何泄漏連接。

0

查詢數據庫:

select * from pg_stat_activity; 

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


幾項檢查的代碼/配置:

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

  • 如果您在使用Hibernate 5.1.0.Final,然後persistence.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" />

它可能會導致連接泄漏時遲緩裝載。相關討論:


檢查相關文章: