Ich habe ein Webapp programmiert und online gestellt. Die Seite befindet sich noch im Testbetrieb und wird daher zur Zeit fast auschschließlich von mir genutzt. Über Nacht, wenn keine Abrufe stattfinden, läuft allerdings die MySQL Session aus, so dass ich am nächsten Tag ständig Fehlermeldungen auf meiner Seite bekomme und ich die Seite im Tomcat neu laden muss. Ich habe das Ganze mal auf meiner lokalen Maschine getestet und den Timeout für die SQL Verbindung auf 30 Sekunden runtergesetzt:
Code:
[mysqld]
...
wait_timeout=30
Dann erhalte ich, wie auch auf dem Server (nach einigen Stunden), folgende Fehlermeldungen beim Zugriff auf die Datenbank:
Code:
Jul 31, 2009 10:10:56 AM org.apache.catalina.core.ApplicationContext log
SEVERE: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract parken.client.universal.SearchResult parken.client.search.SearchService.searchParkingPlaces(parken.client.universal.SearchObject)' threw an unexpected exception: org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query
...
Caused by: org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:627)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
...
Caused by: org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
...
Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
** BEGIN NESTED EXCEPTION **
com.mysql.jdbc.CommunicationsException
MESSAGE: 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:1963)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
Meine hibernate.cfg.xml sieht so aus:
Code:
<hibernate-configuration>
<session-factory>
<property name="connection.url">
jdbc:mysql://localhost:3306/testDB
</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.username">
dbuser
</property>
<property name="connection.password">
secret
</property>
<!--<property name="hbm2ddl.auto">create</property>-->
<property name="show_sql">false</property>
<property name="format_sql">true</property>
<property name="hibernate.c3p0.acquire_increment">3</property>
<property name="hibernate.c3p0.idle_test_period">14400</property>
<property name="hibernate.c3p0.timeout">25200</property>
<property name="hibernate.c3p0.max_size">15</property>
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>
<!-- SQL Dialect to use. Dialects are database specific -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- Mapping files omitted -->
</session-factory>
</hibernate-configuration>
Da ich Spring benutze zeige ich Euch noch den Datenbankteil aus meiner applicationContext.xml:
Code:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testDB"/>
<property name="user" value="dbuser"/>
<property name="password" value="secret"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
Nun weiß ich leider nicht an welchen Parametern ich schrauben muss damit überprüft wird ob eine bestehende Verbindung noch gültig ist oder nicht. Wie Ihr seht benutze ich C3P0 als ConnectionPool.
So wie ich das verstehe bedeuten die Eigenschaften,
Code:
<property name="hibernate.c3p0.idle_test_period">14400</property>
<property name="hibernate.c3p0.timeout">25200</property>
dass nach 14400 Sekunden (=4 Stunden) geprüft wird ob eine Verbindung nicht genutzt wurde und nach 25200 Sekunden (=7 Stunden) wird die Verbindung gelöscht.
Desweiteren habe ich den Timeout in der Mysql Konfdatei /etc/my.cnf auf 24h = 86400sec hochgesetzt. Nun kommt der Fehler halt nach 24 Stunden.
Wie kann ich dieses Problem reparieren?