Communication communication error due to: java.io.EOFException

My webapp runs on Tomcat 5.5, I declared a data source 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> 

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

Database - MySql 5.0. Everything works well, except that sometimes, after several hours of "unuse", the first time I get 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 upgrade and it works again. Any ideas? Thanks.

+3
source share
1 answer

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

What you need to do is set up a test that Tomcat must use before reusing a federated 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" /> 

[EDIT] This page provides more information: Setting up a MySQL data source in Apache Tomcat

+8
source

Source: https://habr.com/ru/post/1241313/


All Articles