【问题标题】:Communications link failure due to: java.io.EOFException由于以下原因导致通信链接失败:java.io.EOFException
【发布时间】:2023-03-03 23:44:01
【问题描述】:

我的 webapp 在 Tomcat 5.5 上运行,我在 web.xml 中声明了数据源:

<resource-ref>
    <res-ref-name>jdbc/OrdiniWebDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

在 context.xml (tomcat conf) 中:

<Resource 
  auth="Container" 
  driverClassName="com.mysql.jdbc.Driver" 
  maxActive="100" 
  maxIdle="30" 
  maxWait="10000" 
  name="jdbc/OrdiniWebDS" 
  password="[mypassword]" 
  type="javax.sql.DataSource" 
  url="jdbc:mysql://[myHost:port]/ordiniweb" 
  username="[myusername]"
 />

数据库是MySql 5.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:1956)
 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2368)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2867)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1616)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1708)
 at com.mysql.jdbc.Connection.execSQL(Connection.java:3255)
 at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1293)
 at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1428)
 at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
 at com.blasetti.ordiniweb.dao.OrdiniDAO.caricaOrdine(OrdiniDAO.java:263)
...
** END NESTED EXCEPTION **



Last packet sent to the server was 0 ms ago.
 com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2579)
 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2867)
 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1616)
 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1708)
 com.mysql.jdbc.Connection.execSQL(Connection.java:3255)
 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1293)
 com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1428)
 org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
 com.blasetti.ordiniweb.dao.OrdiniDAO.caricaOrdine(OrdiniDAO.java:263)
...

我需要刷新,它再次运行良好。任何的想法?谢谢。

【问题讨论】:

    标签: jdbc tomcat5.5 communicationexception


    【解决方案1】:

    MySQL 会在一段时间后丢弃未使用的连接,因为它假定对方忘记关闭它。

    您需要做的是配置一个 Tomcat 在重用池连接之前应该应用的检查。为此,请将?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8 添加到URL 的末尾,并将validationQuery="Select 1" 添加到Resource 元素:

    <Resource 
      auth="Container" 
      driverClassName="com.mysql.jdbc.Driver" 
      maxActive="100" 
      maxIdle="30" 
      maxWait="10000" 
      name="jdbc/OrdiniWebDS" 
      password="[mypassword]" 
      type="javax.sql.DataSource" 
      url="jdbc:mysql://[myHost:port]/ordiniweb?autoReconnect=true&useUnicode=true&characterEncoding=utf8" 
      username="[myusername]"
      validationQuery="Select 1"
     />
    

    [编辑] 此页面提供更多详细信息:Configuring a MySQL Datasource in Apache Tomcat

    【讨论】:

    • 听起来很有趣,我一定会尝试的。阅读您链接的页面,我认为我不需要“useUnicode”和“characterEncoding”参数。谢谢,我会更新你的。
    • 谢谢Aaron,你的回答帮了很大忙,能否请你建议在休眠的情况下如何做
    • @YashpalSingla:您需要使用 c3p0 或 dbcp 等连接池连接到数据库。
    • @AaronDigulla 非常感谢!你先生拯救了我的一天。 DBCP 和 Hibernate 也有类似的问题。 autoReconnect=true 救了我。
    • ?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8 ... 请注意,如果你想要 real UTF8(这是 max. 4 bytes 而不是 mysql 'UTF8' 这是max. 3 bytes 并且无法编码所有 Unicode)您需要指定 ?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8mb4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2013-11-30
    • 2015-06-20
    • 2012-05-09
    • 2015-08-15
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多