2011-01-18 12 views
6

¿Alguien sabe una manera de restablecer/reintentar de nuevo la conexión de hibernación. Quiero decir, por ejemplo: la base de datos remota está inactiva y comienzo mi aplicación. Hibernate no puede establecer una conexión. falla. Pero la aplicación no está cerrada. ¿Hay alguna manera de decir hibernate para intentar una vez más establecer una conexión?Recuperar la conexión de Hibernate

Gracias de antemano

Respuesta

1

C3P0 es la implementación connection-pool interno de hibernación.

Agregue "hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider" en el archivo de propiedades hibernate. Cree un archivo c3p0.properties configurando los parámetros en consecuencia. Este archivo & c3p0-x.jar debe estar en classpath.

c3p0.properties

  • c3p0.idleConnectionTestPeriod: Si esto es un número mayor que 0, c3p0 pondrá a prueba todas las conexiones inactivas, pero sin control agrupado de salida, cada segundo de este número.

  • c3p0.testConnectionOnCheckout: Úselo solo si es necesario. Costoso. Si es verdadero, se realizará una operación en cada conexión para verificar que la conexión sea válida. Mejor elección: verifique las conexiones periódicamente usando idleConnectionTestPeriod.

hay varias otras propiedades que se pueden configurar en hibernate.properties & c3p0.properties.

+0

Sí, este fue mi primer paso. Pero no funcionó. Hice todo lo que estás hablando pero sin resultado. El probador del conjunto de conexiones C3p0 no se llama si DB está inactivo. Si DB está funcionando y comencé la aplicación cuando el probador también está funcionando, veo que es capaz de verificar el estado de la conexión. Pero quiero saber qué hacer en caso de que DB no funcione. Quise decir que la aplicación intentó crear un conjunto de conexiones pero sin éxito, después de algún tiempo intentará hacerlo una vez más. – Andrey

+0

Si su DB está inactivo, lo intentará de nuevo para adquirir Reintentar tiempos de inactividad, con un retraso de adquirir Reintentos entre cada intento y después de eso probablemente resultará en una excepción. –

+0

Sí, esto es lo que veo. Hibernate intenta volver a conectar las horas de acquireRetryAttempts con la retención de acquireRetryDelay, pero después no hay ninguna excepción. Y no entiendo cómo entender está hibernate conectado o no a DB. – Andrey

18

Usted realmente debe ir para la conexión C3P0 puesta en común: http://www.mchange.com/projects/c3p0/index.html#hibernate-specific

Hay una sección en la documentación C3P0 sobre ese tema: http://www.mchange.com/projects/c3p0/index.html#configuring_recovery

Primero hay que configurar correctamente c3p0, que en el caso de la utilización de hibernación debe suceder en el archivo c3p0.properties.

En sus c3p0.properties poner estas propiedades para volver a intentar volver a conectarse de forma indefinida cada 3 segundos cuando la base de datos está abajo:

c3p0.acquireRetryAttempts = 0 
c3p0.acquireRetryDelay = 3000 
c3p0.breakAfterAcquireFailure = false 

Además, para evitar interrupciones en las comunicaciones tumbado en su piscina de forma indefinida, utilice gestión de la edad conexión:

c3p0.maxConnectionAge = 6000 
c3p0.maxIdleTime = 6000 
c3p0.maxIdleTimeExcessConnections = 1800 
c3p0.idleConnectionTestPeriod = 3600 

Estos pueden ser bastante caro, pero muy útil si lo anterior no es suficiente:

c3p0.testConnectionOnCheckout = true 
c3p0.preferredTestQuery = SELECT 1; 

También es posible que desee comprobar si hay fugas de conexión que impiden la recuperación:

c3p0.debugUnreturnedConnectionStackTraces = true 

Y, por último, asegúrese de que C3P0 se engancha con la hibernación correctamente, habilitar el registro de depuración para el paquete "com.mchange" y ver si dice C3P0 Tienes algo sobre sí mismo. Debe indicar las propiedades de configuración que están cargadas, así que vea si está todo allí.

Espero que esto ayude.

0

Puede ser, intenta llamar al método .getCurrentSession() lugar .openSession()?

Si la conexión se cae, debe establecer una nueva.

Espero que esto ayude.

Cuestiones relacionadas