2010-08-11 136 views
0

我使用休眠的MySQLC3P0的java.io.EOFException的,并且当8小时(wait_timeout)之后的MySQL连接期满,Hibernate是无法重新连接而我得到以下异常:休眠,C3P0和MySQL:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 
** BEGIN NESTED EXCEPTION ** 

java.io.EOFException 

STACKTRACE: 

java.io.EOFException 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715) 
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3249) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) 
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1812) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:697) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
    at org.hibernate.loader.Loader.doList(Loader.java:2232) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129) 
    at org.hibernate.loader.Loader.list(Loader.java:2124) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 

这是hibernate.cfg:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 

     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property> 
     <property name="hibernate.connection.username">username</property> 
     <property name="hibernate.connection.password">password</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> 
     <property name="hibernate.query.substitutions">true 1, false 0</property> 

     <property name="hibernate.current_session_context_class">thread</property> 

     <property name="hibernate.hbm2ddl.auto">validate</property> 
     <property name="hibernate.connection.autocommit">false</property> 

     <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>   
     <property name="hibernate.c3p0.min_size">3</property> 
     <property name="hibernate.c3p0.max_size">10</property> 
     <property name="hibernate.c3p0.timeout">180</property> 
     <property name="hibernate.c3po.max_idle_time">180</property> 
     <property name="hibernate.c3p0.idle_test_period">300</property> 
     <property name="hibernate.c3p0.acquire_increment">3</property> 

     <!-- My mappings here --> 
    </session-factory> 
</hibernate-configuration> 

,这是我c3p0.properties文件:

c3p0.preferredTestQuery=SELECT 1 

UPDATE:

下面的日志文件:

INFO - com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManager(462) | Initializing c3p0 pool... [email protected] 
c [ connectionPoolDataSource -> [email protected] [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetr 
yDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassNam 
e -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation 
-> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> jbnj238aq9q7lecas8ck|79b0d33c, idleConnectionTestPeriod -> 300, initialPoolSize -> 3, 
maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 180, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxState 
mentsPerConnection -> 0, minPoolSize -> 3, nestedDataSource -> [email protected] [ description -> null, driverClass -> null 
, factoryClassLocation -> null, identityToken -> jbnj238aq9q7lecas8ck|445ead9d, jdbcUrl -> jdbc:mysql://localhost:3306/mydb, properties -> {user=******, p 
assword=******, autocommit=false} ], preferredTestQuery -> SELECT 1, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, 
unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, iden 
tityToken -> jbnj238aq9q7lecas8ck|26796e1c, numHelperThreads -> 
3 ] 

任何尖端被理解。
谢谢

+0

你可以包含c3p0初始化日志输出吗?例如,在我的机器上,我看到'Initializing c3p0 pool ... [email protected] [connectionPoolDataSource - > [email protected] [acquireIncrement - > 3,acquireRetryAttempts - > 30'等,列出完整的配置。这是验证您的设置正在被拾取的好方法。 – 2010-08-11 18:56:23

+0

当然,我已经更新了我的问题。 – Mark 2010-08-11 20:18:36

回答

0

这是我抓到的部分。

the MySQL connection expires after 8 hours 

如果您使用c3p0,则不应该发生这种情况。你应该建立一个新的连接并将它们存储在池中。

如果您不添加新连接或刷新那些连接,您将超时。如果您多次尝试超时,请告诉c3p0重建/刷新连接池。

-1

愚蠢的问题:在Hibernate的配置,你有下面这行:

<property name="hibernate.c3po.max_idle_time">180</property> 

oc3po应该是一个0。这只是一个复制和粘贴错误?丢失max_idle_time设置肯定会导致这个问题。

编辑:在审查c3p0 docs后,它看起来像正确的设置名称是hibernate.c3p0.timeout

编辑2:我只是看着你的配置,你已经有hibernate.c3p0.timeout。 D'哦。所以你可以忽略这整个答案:-P。

1

我解决了这个问题:

设置C3P0属性时,的hibernate.c3p0.idle_test_period值一定不能是hibernate.c3p0.timeout高。所以在我的情况设置:

<property name="hibernate.c3p0.timeout">180</property> 
<property name="hibernate.c3p0.max_idle_time">180</property> 
<property name="hibernate.c3p0.idle_test_period">100</property> 

修复它。