En sus propiedades de configuración, ha utilizado la propiedad c3p0 maxIdleTime, pero las propiedades c3p0 se configuran utilizando c3p0.
prefijo o hibernate.c3p0.
. Tenga en cuenta que habilitar cualquiera de c3p0
properties habilita automáticamente el proveedor de conexión correspondiente mediante la heurística de hibernación. En el log no se ve que estés usando c3p0. Si no tiene fuentes de datos configuradas, Hibernate usará hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
. Este proveedor de conexión tiene un grupo de conexiones rudimentario integrado para el que puede configurar un hibernate.connection.pool_size
, pero solo se utiliza con fines de desarrollo. Nunca lo utilice en el entorno de producción.
Es posible que tenga una discusión interminable sobre el tema Cómo reparar java.net.SocketException:tubería rota . Después de un tiempo te darás cuenta de que has permanecido abierto conexiones en el grupo, que repentinamente se cierran en el otro lado por las siguientes razones:
- Los cortafuegos o los enrutadores pueden restringir las conexiones inactivas (el protocolo cliente/servidor de MySQL no lo hace).
- El servidor MySQL puede estar cerrando conexiones inactivas que exceden el
wait_timeout
ointeractive_timeout
límite.
Para ayudar a solucionar estos problemas, se pueden utilizar los siguientes consejos:
- Se utiliza una versión reciente (5.1.13+) del controlador JDBC.
- Asegúrese de que
wait_timeout
yinteractive_timeout
se fijan lo suficientemente alto. Compruebe siinteractiveClient
se utiliza. - Asegúrese de que
tcpKeepalive
está habilitado. - Asegúrese de que cualquier configuración configurable de tiempo de espera del enrutador o del cortafuegos permita el tiempo de inactividad de conexión máximo esperado.
- Asegúrese de que las conexiones sean válidas cuando se usan desde el conjunto de conexiones. Use una consulta que comience con
/* ping */
para ejecutar un ping ligero en lugar de una consulta completa. Tenga en cuenta que la sintaxis del ping debe ser exactamente como se especifica aquí. - Valide explícitamente la conexión antes de usarla si la conexión se ha dejado inactiva durante un período de tiempo prolongado.
- Minimice el tiempo que un objeto de conexión permanece inactivo mientras se ejecuta otra lógica de aplicación.
Para cumplir con algunas de estas opciones, es mejor que use un grupo de conexiones que pueda usar con Hibernate. Hibernate tiene soporte para commons-dbcp, c3p0 y proxool. También puede configurar la fuente de datos JNDI en el servidor web para usar con hibernación, tiene un grupo de conexiones. Consulte Capítulo 7 Agrupación de conexiones con conector/J .
Si desea configurar Hibernate con c3p0, debe leer este Cómo configurar el grupo de conexiones C3P0 . Para ver la configuración de ejemplo de dbcp, debe consultar esta publicación MySQL, Hibernate and Broken Pipe Exception . Cualquier agrupación de conexiones que utilice depende de usted.