Hibernate使用C3P0的連線池

tbase發表於2007-02-24
最近的一個專案在Hibernate使用C3P0的連線池,資料庫為Mysql。開發測試沒有問題,在執行中每個一段長的空閒時間就出現異常:[@more@]最近的一個專案在Hibernate使用C3P0的連線池,資料庫為Mysql。開發測試沒有問題,在執行中每個一段長的空閒時間就出現異常:
java 程式碼
  1. org.hibernate.exception.JDBCConnectionException: could not execute query
  2. at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
  3. at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
  4. .......
  5. Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
  6. ** BEGIN NESTED EXCEPTION **
  7. com.mysql.jdbc.CommunicationsException
  8. MESSAGE: Communications link failure due to underlying exception:
  9. ** BEGIN NESTED EXCEPTION **
  10. java.net.SocketException
  11. MESSAGE: Broken pipe
  12. STACKTRACE:
  13. java.net.SocketException: Broken pipe
  14. at java.net.SocketOutputStream.socketWrite0(Native Method)
  15. ......
  16. ** END NESTED EXCEPTION **

檢視了Mysql的文件,以及Connector/J的文件以及線上說明發現,出現這種異常的原因是:

Mysql伺服器預設的“wait_timeout”是8小時,也就是說一個connection空閒超過8個小時,Mysql將自動斷開該connection。這就是問題的所在,在C3P0 pools中的connections如果空閒超過8小時,Mysql將其斷開,而C3P0並不知道該connection已經失效,如果這時有Client請求connection,C3P0將該失效的Connection提供給Client,將會造成上面的異常。

解決的方法有3種:

  1. 增加wait_timeout的時間。
  2. 減少Connection pools中connection的lifetime。
  3. 測試Connection pools中connection的有效性。

當然最好的辦法是同時綜合使用上述3種方法,下面就DBCP和C3P0分別做一說明,假設wait_timeout為預設的8小時

DBCP增加以下配置資訊:

  1. //set to 'SELECT 1'
  2. validationQuery = "SELECT 1"
  3. //set to 'true'
  4. testWhileIdle = "true"
  5. //some positive integer
  6. timeBetweenEvictionRunsMillis = 3600000
  7. //set to something smaller than 'wait_timeout'
  8. minEvictableIdleTimeMillis = 18000000
  9. //if you don't mind a hit for every getConnection(), set to "true"
  10. testOnBorrow = "true"

C3P0增加以下配置資訊:

  1. //set to 'SELECT 1'
  2. preferredTestQuery = 'SELECT 1'
  3. //set to something much less than wait_timeout, prevents connections from going stale
  4. idleConnectionTestPeriod = 18000
  5. //set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
  6. maxIdleTime = 25000
  7. //if you can take the performance 'hit', set to "true"
  8. testConnectionOnCheckout = true

更多的配置資訊大家可以檢視C3P0文件,Connector/J文件,以及DBCP的文件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/249132/viewspace-900250/,如需轉載,請註明出處,否則將追究法律責任。

相關文章