本文介绍了由于以下原因导致通信链接失败:java.io.EOFException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My webapp is running on Tomcat 5.5, I declared the datasource in 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):

In 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.一切都运行良好,除了有时在几个小时的不使用"后,首次访问时出现了此异常:

The database is a MySql 5.0.Everything works well except that sometimes, after several hours of "unuse", at first access I got this Exception:

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)
...

我需要刷新,它再次正常运行.任何的想法?谢谢.

I need to refresh and it works well again. Any idea? Thanks.

推荐答案

MySQL会在一段时间后删除未使用的连接,因为它假定另一方忘记关闭它.

MySQL drops unused connections after a while because it assumes that the other side forgot to close it.

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

What you need to do is to configure a check that Tomcat should apply before it reuses a pooled connection. To do this, add ?autoReconnect=true&useUnicode=true&characterEncoding=utf8 to the end of the URL and add validationQuery="Select 1" to the Resource element:

<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"
 />

此页面提供了更多详细信息:在Apache Tomcat中配置MySQL数据源

This page gives more details: Configuring a MySQL Datasource in Apache Tomcat

这篇关于由于以下原因导致通信链接失败:java.io.EOFException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-06 10:09