2010-05-29 81 views
5

我的Java应用程序,它使用Hibernate和它被Tomcat 6.0主办,得到了以下异常活动的很长一段时间后,当它试图访问DB:Tomcat中,休眠和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) 

任何提示?

由于

+0

很好判断错误,这个页面有什么要说的http://java.sun.com/j2se/1.4.2/docs/api/java/io/EOFException.html和长时间的超时它会似乎无论出于何种原因,您的应用程序/ hibernate无法连接到您的数据库。检查数据库网址,端口和登录信息。 – 2010-05-29 11:21:36

+0

似乎Hibernate无法在连接到期时重新连接到数据库。因为它首先起作用,那么在长时间不活动之后,将抛出异常。 – Mark 2010-05-29 11:26:29

+0

啊好的这是一个配置选项。你可以得到jdbc重新连接,但关闭顶部不知道答案,请尝试谷歌http://www.google.com/search?hl=en&q=jdbc+hibernate+reconnect – 2010-05-29 11:50:03

回答

3

MySQL将默认8小时(在wait_timeout)后关闭空闲连接。这是一个“着名的问题”,你可以在互联网上找到很多关于它的参考文献,例如this one。因此,要么:

  • 配置Tomcat以测试数据源配置使用validationQuery上借连接:

    <parameter> 
        <name>validationQuery</name> 
        <value>select 1</value> 
    </parameter> 
    
  • 增加的MySQL经由my.cnf/my.iniwait_timeout,或通过与一个命令行SQL客户端连接和输入SET GLOBAL wait_timeout=86400或其他合适的秒数。

请注意,我不知道第二个选项的所有后果。如果你决定采用第二种选择方式,我建议发布另一个问题以获得MySQL专家的反馈。