Tomcat、Hibernate 和 java.io.EOFException

Posted

技术标签:

【中文标题】Tomcat、Hibernate 和 java.io.EOFException【英文标题】:Tomcat, Hibernate and the java.io.EOFException 【发布时间】:2011-02-25 11:01:09 【问题描述】:

我的 Java 应用程序使用 Hibernate 并由 Tomcat 6.0 托管,当它尝试访问数据库时,在长时间不活动后出现以下异常:

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)

有什么建议吗?

谢谢

【问题讨论】:

从错误来看,这个页面要说什么java.sun.com/j2se/1.4.2/docs/api/java/io/EOFException.html 以及长时间的超时似乎无论出于何种原因,您的应用程序/休眠都无法连接到您的数据库。检查数据库 url、端口和登录详细信息。 连接到期时,Hibernate 似乎无法重新连接到数据库。因为首先它可以工作,然后在长时间不活动后抛出异常。 啊好的,这是一个配置选项。您可以让 jdbc 重新连接,但不知道答案,请尝试 google google.com/search?hl=en&q=jdbc+hibernate+reconnect 【参考方案1】:

默认情况下,MySQL 将在 8 小时后关闭空闲连接(wait_timeout)。这是一个“著名的问题”,你会在互联网上找到很多关于它的参考资料,例如this one。所以要么:

使用数据源配置中的 validationQuery 配置 tomcat 以测试借用连接:

<parameter>
  <name>validationQuery</name>
  <value>select 1</value>
</parameter>

通过my.cnf/my.ini 增加MySQL 的wait_timeout,或通过连接命令行SQL 客户端并输入SET GLOBAL wait_timeout=86400,或其他合适的秒数。

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

【讨论】:

以上是关于Tomcat、Hibernate 和 java.io.EOFException的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat、Hibernate 和 java.io.EOFException

Tomcat/Hibernate 问题“严重:错误 listenerStart”

搭建springmvc4 spring4 hibernate4整合框架tomcat用啥版本

Tomcat/Hibernate 与 MySql 的连接失败,出现“通信链接失败”和“权限被拒绝”

Tomcat 8、HikariCP、Hibernate 和 MySQL

在tomcat上与hibernate和mysql共享c3p0连接池