Hibernate使用C3P0的連線池
最近的一個專案在Hibernate使用C3P0的連線池,資料庫為Mysql。開發測試沒有問題,在執行中每個一段長的空閒時間就出現異常:[@more@]最近的一個專案在Hibernate使用C3P0的連線池,資料庫為Mysql。開發測試沒有問題,在執行中每個一段長的空閒時間就出現異常:
java 程式碼
- org.hibernate.exception.JDBCConnectionException: could not execute query
- at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
- at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
- .......
- Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
- ** BEGIN NESTED EXCEPTION **
- com.mysql.jdbc.CommunicationsException
- MESSAGE: Communications link failure due to underlying exception:
- ** BEGIN NESTED EXCEPTION **
- java.net.SocketException
- MESSAGE: Broken pipe
- STACKTRACE:
- java.net.SocketException: Broken pipe
- at java.net.SocketOutputStream.socketWrite0(Native Method)
- ......
- ** 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種:
- 增加wait_timeout的時間。
- 減少Connection pools中connection的lifetime。
- 測試Connection pools中connection的有效性。
當然最好的辦法是同時綜合使用上述3種方法,下面就DBCP和C3P0分別做一說明,假設wait_timeout為預設的8小時
DBCP增加以下配置資訊:
- //set to 'SELECT 1'
- validationQuery = "SELECT 1"
- //set to 'true'
- testWhileIdle = "true"
- //some positive integer
- timeBetweenEvictionRunsMillis = 3600000
- //set to something smaller than 'wait_timeout'
- minEvictableIdleTimeMillis = 18000000
- //if you don't mind a hit for every getConnection(), set to "true"
- testOnBorrow = "true"
C3P0增加以下配置資訊:
- //set to 'SELECT 1'
- preferredTestQuery = 'SELECT 1'
- //set to something much less than wait_timeout, prevents connections from going stale
- idleConnectionTestPeriod = 18000
- //set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
- maxIdleTime = 25000
- //if you can take the performance 'hit', set to "true"
- testConnectionOnCheckout = true
更多的配置資訊大家可以檢視C3P0文件,Connector/J文件,以及DBCP的文件。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/249132/viewspace-900250/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於hibernate使用c3p0連線池的問題.
- Hibernate連線池配置
- 4、資料庫連線池的概念及C3P0、Uruid兩種連線池的使用資料庫UI
- 用idea配置c3p0連線池Idea
- 401、Java框架55 -【Hibernate - C3P0連線池】 2020.10.29Java框架
- c3p0資料庫連線池問題資料庫
- Hibernate【查詢、連線池、逆向工程】
- Java Hibernate 之連線池詳解Java
- hibernate資料庫連線池的問題資料庫
- 解密httpclient,dbcp,jedis,c3p0,druid,okhttp都在使用的連線池技術解密HTTPclientUI
- 資料庫連線(2) - 為什麼C3P0連線池那麼慢資料庫
- 【很全很新】C3P0 連線池和 DBUtils 配合事務使用總結
- Java Web(十) JDBC的增刪改查,C3P0等連線池,dbutils框架的使用JavaWebJDBC框架
- Proxool 連線池的配置使用
- SSH 框架整合(maven版本 xml配置方式 連線池c3p0)框架MavenXML
- proxool連線池如何使用SSL方式連線?
- Tomcat連線池使用Tomcat
- 資料庫連線池的使用資料庫
- 資料庫連線池優化配置(druid,dbcp,c3p0)資料庫優化UI
- struts string和hibernate 如何配置dataSource為連線池
- 25、連線池(DBCP、C3P0)、動態代理與分頁技術
- 常用資料庫連線池 (DBCP、c3p0、Druid) 配置說明資料庫UI
- 連線池
- 【JDBC】使用OracleDataSource建立連線池用於連線OracleJDBCOracle
- 【MySQL】自定義資料庫連線池和開源資料庫連線池的使用MySql資料庫
- PROXOOL資料庫連線池使用資料庫
- 在JBOSS中使用mysql連線池MySql
- java資料庫連線池dbcp的使用Java資料庫
- DBCP 資料連線池的配置和使用
- 跪求?????JBoss中的連線池配置及使用
- Go連線池Go
- HTTP連線池HTTP
- Jedis使用連線池操作redis叢集Redis
- 怎麼在 JMX 中使用連線池
- ConnectionProviderFactory 使用那種“連線池”IDE
- Http持久連線與HttpClient連線池HTTPclient
- 連線池和連線數詳解
- 所有池連線均在使用,並且達到了最大池大小。