2010-05-29 18 views
5

Mi Java, que utiliza Hibernate y se aloja por Tomcat 6.0, obtiene la siguiente excepción después de un largo tiempo de inactividad cuando se trata de acceder a la base de datos:Tomcat, Hibernate y la aplicación 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) 

¿Algún consejo?

Gracias

+0

bien a juzgar por el error, lo que esta página tiene que decir http://java.sun.com/j2se/1.4.2/docs/api/java/io/EOFException.html y el tiempo de espera prolongado que lo haría parece que por alguna razón su aplicación/hibernación no puede conectarse a su base de datos. Verifique la dirección URL, el puerto y los detalles de inicio de sesión. –

+0

Parece que Hibernate no puede volver a conectarse a la base de datos cuando expira la conexión. Porque primero funciona, luego de una larga inactividad, se lanza la excepción. – Mark

+0

ah ok esta es una opción de configuración. puedes obtener jdbc para volver a conectarte, pero fuera de la cabecera no sé la respuesta, prueba un google http://www.google.com/search?hl=es&q=jdbc+hibernate+reconnect –

Respuesta

3

MySQL se cerrarán las conexiones inactivas después de 8 horas de forma predeterminada (la wait_timeout). Este es un "problema famoso" y encontrará muchas referencias de él en Internet, por ejemplo this one. Así que o bien:

  • configurar Tomcat para probar conexiones en préstamo utilizando un validationQuery en la configuración de fuente de datos:

    <parameter> 
        <name>validationQuery</name> 
        <value>select 1</value> 
    </parameter> 
    
  • aumento de wait_timeout través my.cnf/my.ini MySQL, o mediante la conexión con una línea de comandos del cliente de SQL y ingresando SET GLOBAL wait_timeout=86400, o alguna otra cantidad adecuada de segundos.

Tenga en cuenta que no conozco todas las consecuencias de la segunda opción. Si decides ir por la segunda opción, te sugiero publicar otra pregunta para obtener comentarios de los expertos de MySQL.

Cuestiones relacionadas