José Paumard
Wed, 10 Mar 2010 08:36:39 -0800
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