tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From José Paumard <Jose.Paum...@orange.fr>
Subject Tomcat DBCP : testOnBorrow not working (?)
Date Wed, 10 Mar 2010 16:36:05 GMT
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Mime
View raw message