Could not execute query (Hibernate & MySQL 5)
Si trabajáis con Struts y Hibernate es posible que al realizar una acceso a la base de datos después de un cierto tiempo de inactividad en el servidor os encontréis con el siguiente error:
org.hibernate.exception.JDBCConnectionException: could not execute query
En mi caso, se trata de una aplicación web Struts 1.1, en un servidor Tomcat 5.5, atacando una base de datos MySQL 5.0.45 (JDK 1.5). El servidor es un Fedora, pero también se reproduce el problema en un Windows XP. El acceso a la base de datos se realiza con Hibernate 3.0
El error me le encontraba cada mañana a primera hora al hacer el primer acceso a la base de datos. Si desde el navegador forzaba el refresco de la página, en el segundo intento la página se cargaba correctamente. Parecía pues que el problema era debido a que después de un cierto tiempo de inactividad en el servidor, se cerraban las conexiones a la base de datos.
Buscando soluciones y consultando documentación, encontré varias posibles soluciones (una de ellas sugería capturar la excepción y lanzar la consulta a la base datos repetidas veces hasta no obtener el error, ¡menuda chapuza!).
En mi caso, finalmente opté por usar C3P0 como gestor del pool de conexiones con la base de datos. Así pues, lo que fue:
- Descargar la librería C3P0
- Añadir la librería C3P0 a mi aplicación Struts
- Configurar la propiedades C3P0 en el archivo de configuración de Hibernate (hibernate.cfg.xml):
org.hibernate.connection.C3P0ConnectionProvider
<!-- configuration pool via c3p0-->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">1800</property><!-- seconds -->
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">10</property>
Podéis consultar la documentación de C3P0 y de Hibernate para más información sobre los valores de estas propiedades y para ver el resto de propiedades.
Espero que con esta información tengáis suficiente para resolver el problema. Si no es así podéis añadir un comentario...
Esta obra está bajo una licencia de Creative Commons.