2010-05-29 15 views
5
applicazione

mio Java, che utilizza Hibernate ed è ospitato da Tomcat 6.0, ottiene la seguente eccezione dopo un lungo periodo di inattività quando si tenta di accedere al DB:Tomcat, Hibernate e l'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 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) 

Qualche consiglio?

Grazie

+0

giudicando bene dall'errore, cosa questa pagina deve dire http://java.sun.com/j2se/1.4.2/docs/api/java/io/EOFException.html e il lungo timeout sarebbe sembra che per qualsiasi motivo la tua app/ibernazione non riesca a connettersi al tuo db. Controlla l'URL db, la porta e i dettagli di accesso. –

+0

Sembra che Hibernate non sia in grado di riconnettersi al db quando scade la connessione. Perché prima funziona, poi dopo una lunga inattività viene lanciata l'eccezione. – Mark

+0

ah ok questa è un'opzione di configurazione. puoi ottenere jdbc per riconnetterti ma non sai rispondere, prova google http://www.google.com/search?hl=it&q=jdbc+hibernate+reconnect –

risposta

3

MySQL chiuderanno connessioni inattive dopo 8 ore per impostazione predefinita (il wait_timeout). Questo è un "famoso problema" e su Internet ci sono molti riferimenti su di esso, ad esempio this one. Quindi, o:

  • Configurazione di Tomcat per verificare le connessioni su prestito con un validationQuery nella configurazione origine dati:

    <parameter> 
        <name>validationQuery</name> 
        <value>select 1</value> 
    </parameter> 
    
  • aumento del wait_timeout via my.cnf/my.ini MySQL, oppure collegando con una riga di comando client SQL e immettendo SET GLOBAL wait_timeout=86400 o qualche altro numero appropriato di secondi.

Nota che non sono a conoscenza di tutte le conseguenze della seconda opzione. Se decidi di passare alla seconda opzione, ti suggerirei di postare un'altra domanda per ottenere feedback dagli esperti di MySQL.