2010-08-11 4 views
0

J'utilise Mise en veille prolongée avec MySQL et c3p0, et lorsque la connexion MySQL expire après 8 heures (wait_timeout), Mise en veille prolongée est incapable de se reconnecter et je reçois l'exception suivante:Mise en veille prolongée, C3P0 et Mysql: le java.io.EOFException

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) 

C'est le 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> 

et voici mon fichier c3p0.properties:

c3p0.preferredTestQuery=SELECT 1 

MISE À JOUR:

Ci-dessous le fichier journal:

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 ] 

Toute pointe est apprécié.
Merci

+0

Pouvez-vous inclure la sortie du journal d'initialisation c3p0? Par exemple, sur ma machine, je vois 'Initialiser le pool c3p0 ... [email protected] [connectionPoolDataSource -> [email protected] [acquérirIncrement -> 3, acquérirRetryAttempts - > 30', etc., listant la configuration complète. C'est un bon moyen de vérifier que vos paramètres sont sélectionnés. –

+0

Bien sûr, j'ai mis à jour ma question. – Mark

Répondre

0

C'est la partie que j'ai attrapée.

the MySQL connection expires after 8 hours 

Cela ne devrait pas se produire si vous utilisez c3p0. Vous devriez créer une nouvelle connexion et les stocker dans le pool.

Si vous n'ajoutez pas de nouvelles connexions ou si vous actualisez celles que vous avez, vous expirez. Si vous expirez avec plusieurs tentatives, dites à c3p0 de recréer/actualiser le pool de connexions.

-1

Question idiote: dans la configuration de mise en veille prolongée, vous avez la ligne suivante:

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

Le o dans c3po devrait être un 0. Était-ce juste une erreur de copier-coller? Perdre le max_idle_time paramètre semble certainement que cela causerait ce problème.

EDIT: Après avoir examiné le c3p0 docs, il semble que le nom de réglage correct est hibernate.c3p0.timeout. Je viens de regarder votre configuration et vous avez déjà hibernate.c3p0.timeout. D'oh. Donc, vous pouvez probablement ignorer toute cette réponse: -P.

1

Je résolu le problème:

lorsque vous définissez les propriétés de c3p0, la valeur de hibernate.c3p0.idle_test_period ne doit pas être plus élevé du hibernate.c3p0.timeout. Donc dans mon cas de réglage:

<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> 

l'a fixé.

Questions connexes