Hello all,

Here is my problem. I have a very classical configuration where a webapp with some Hibernate code in it accesses a MySQL DB. Everything is installed in Tomcat 6.

After some time, Hibernate complains about dropped connections, the error message looks like this : com.mysql.jdbc.CommunicationsException : Communications link failure The last packet successfully received from the server was 204 734 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago. java.io.EOFException : Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

Refeshing the page once or twice usually fixes the problem.

I could narrow the problem and reproduce it on demand, juste by setting the wait timeout parameter of MySQL to a very low value : 10s (the default value is 8 hours). If I use my webapp fast enough (less than 10s between clicks) everything runs fine. If I wait just 12s, this problem shows up, 100% of the time. Reloading the page once or twice fixes it.

So my guess here is that Hibernate is provided with a closed connection (please correct me if you think I'm wrong on that point). Setting autoReconnect=true on the connection string doesnt help (I red somewhere that it was not expected to help in the case of MySQL for some reason, so I guess it's normal).

The configuration is the following : the datasource is configured in a context.xml file in the META-INF dir of the webapp.
 <Resource name="jdbc/myds" auth="Container" type="javax.sql.DataSource"
           maxActive="20" maxIdle="10" maxWait="3"
username="***" password="***" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf8"/>

Then the webapp uses it through a declaration in a persistence.xml file (JPA standard file).

   <persistence-unit name="MyDataService">
       <provider>org.hibernate.ejb.HibernatePersistence</provider>
       <non-jta-data-source>java:/comp/env/jdbc/myds</non-jta-data-source>
       <!-- JPA stuff removed -->
   </persistence-unit>

To be sure that DBCP is not providing closed connections to Hibernate, I added the following to the Resource element, but with no success :
 <Resource name="jdbc/myds" auth="Container" type="javax.sql.DataSource"
           maxActive="20" maxIdle="10" maxWait="3"
username="***" password="***" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf8"
           validationQuery="select 1" testOnBorrow="true"/>

From what I understand in the DBCP docs :
- the validation query has to be set to some legal value for DBCP to test the connection, which is the case
- testOnBorrow is true by default, setting it again cant harm can it ?

I tried to tune timeBetweenEvictionRunsMillis, numTestsPerEvictionRun and minEvictableIdleTimeMillis with testWhileIdle set to true, but with no more success.

Any hint would be much appreciated, especially on the logging side (Tomcat / DBCP), since I cant see how to get more information on what is going on with those buggy connections.

Thank you,

José




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to