2010-12-14 2 views
3

Mon webapp est en cours d'exécution sur Tomcat 5.5, je déclarai la source de données dans web.xml:Communications défaillance de la liaison en raison de: java.io.EOFException

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

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

La base de données est un MySQL 5.0. Tout fonctionne bien, sauf que parfois, après plusieurs heures de « unuse », au premier abord j'ai eu cette 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) 
... 

J'ai besoin de rafraîchir et il fonctionne bien à nouveau. Une idée? Merci.

Répondre

8

MySQL supprime les connexions inutilisées après un certain temps car il suppose que l'autre côté a oublié de le fermer.

Ce que vous devez faire est de configurer une vérification que Tomcat doit appliquer avant de réutiliser une connexion groupée. Pour ce faire, ajoutez ?autoReconnect=true&useUnicode=true&characterEncoding=utf8 à la fin de l'URL et ajouter validationQuery="Select 1" à l'élément 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" 
/> 

[EDIT] Cette page donne plus de détails: Configuring a MySQL Datasource in Apache Tomcat

+0

semble intéressant, je vais essayer de vous. En lisant la page que vous avez liée, je pense que je n'ai pas besoin de paramètres 'useUnicode' et 'characterEncoding'. Merci, je vais vous mettre à jour. – mauretto

+0

Merci Aaron, votre réponse a aidé beaucoup, pouvez-vous s'il vous plaît également suggérer comment le faire en cas d'hibernation –

+0

@YashpalSingla: Vous devrez vous connecter à votre base de données en utilisant un pool de connexion comme c3p0 ou dbcp. –

Questions connexes