java - Tomcat、Hibernate 和 java.io.EOFException

标签 java mysql hibernate exception tomcat

我的 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)

有什么建议吗?

谢谢

最佳答案

默认情况下,MySQL 将在 8 小时后关闭空闲连接(wait_timeout)。这是一个“著名问题”,您会在 Internet 上找到很多关于它的引用资料,例如 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 专家的反馈。

关于java - Tomcat、Hibernate 和 java.io.EOFException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2934757/

相关文章:

java - 如何在主框架内制作第二个框架?

java - 访问与 jar 文件相邻的文件

php - 更新 mysql 数据库密码字段安全性

java - 添加 ArrayList<Integer> 耗时过长(超过 50000 个节点)

java - Jsoup选择具有多个类的div

java - 在 hibernate 命名查询中调用自定义函数

java - 使用 H2 数据库和 Flyway 进行 Spring Boot 应用程序测试失败

mysql - 什么时候给表加索引?

mysql - 如何使用 order by 和 group by 之后对列求和

mysql - 安装 MySQL 服务器 8.0.14 失败