2009-09-05 14 views
6

Cuando configuro hibernación para conectarme a un DB y por alguna razón la conexión falla, noté que no arroja ninguna excepción al construir la fábrica (lo cual es aceptable) ni cuando llamo sessionFactory.openSession() (que es menos aceptable). Lo que es más molesto es que session.isConnected() devuelve true después de llamar a sessionFactory.openSession(). (Lo cual es totalmente inaceptable).Hibernate no lanzando excepción cuando se llama a openSession y no se puede establecer la conexión a DB

La única pista hasta ese momento que me dice que no se ha conectado a la base de datos es una entrada de registro WARN causada por una java.sql.SQLException que atrapa internamente y simplemente envía al registrador. Además de crear una pseudo transacción para forzar una excepción, ¿hay alguna otra manera de obtener el estado de la conexión? (Tal vez una opción en la configuración que dice "no registrar el intento de conexión fallida, sino lanzar una excepción de hibernación). He buscado pero no encontré nada. Muchas gracias.

Respuesta

3

¿Qué grupo de conexiones estás usando? Hibernate's built- . should not be used en la piscina para otra cosa que simples pruebas

Proxool, por el contrario, le permite hacer exactamente lo que quiere: configurar test-before-use propiedad en true y se lanzará una excepción si no se puede encontrar o crear una conexión adecuada. puede incluso listen to connection events si lo desea.

3

Como se menciona ChssPly, no se debe utilizar Hibernate incorporado - en la piscina por mucho o nada. Otra opción que no sea Proxool (que no he utilizado personalmente, por lo que no puedo responder personalmente) es C3P0. Definitivamente arroja una excepción al configurar el grupo de conexiones. PUEDO responder por eso :) Como ese es el comportamiento que quiero con nuestra aplicación, funciona perfectamente para nosotros.

0

Perdón por volver a plantear el problema pero: probé C3p0 y es mejor que el built-in, pero en lo que respecta a mi problema no hace absolutamente nada diferente que vanilla hibernate: si no puede adquirir una conexión, arroja un excepción, Hibernate capta esa excepción y, de nuevo, la oculta de mí. Al usar c3p0, sigo usando la API de hibernación, y cualquier cosa que c3p0 arroje, es absorbida por la hibernación. La única forma en que pensé es en crear instancias programáticas de fuentes de datos c3p0, y si no se lanza una excepción (esto puedo detectar), luego pasarlo a hibernar. Pero luego me di cuenta de que para pasar un DataSource a Hibernate, solo puedes hacerlo a través de JNDI URL, y esta no es una opción. Así que mi última esperanza es implementar Proveedor de conexión personalizado, usar c3p0 dentro y ver la excepción de c3p0 allí. ¿Hay otra alternativa?

Tenga en cuenta que no probé Proxool porque parece complicado de configurar con hibernación, aunque yo no le di una buena oportunidad. También lo siento por asignar una respuesta antes de realizar pruebas exhaustivas.

+1

Permítanme aclarar tres cosas aquí: 1) la excepción solo se lanzará si el grupo no puede obtener o crear una conexión funcional; no se lanzará simplemente porque una conexión en particular ha fallado; 2) Hibernate no intentará obtener una conexión hasta que realmente se necesite: 'openSession()' no ** obtiene **; 3) Hibernate no ocultará la excepción de conexión; Sin embargo, lo convertirá en JDBCException que no está marcado, que es lo que debería capturar. – ChssPly76

+0

No estoy seguro de por qué le preocupa tanto que la conexión no se detecte _inmediatamente_ en lugar de cuando realmente intenta hacer algo con ella; pero si lo haces, llama a 'openSession(). connection()' que ** WILL ** intentará obtenerlo y capturará 'JDBCException' de donde puedes obtener' SQLException' anidado si falla. – ChssPly76

+0

su primer comentario clarificó las cosas. Ahora, lo único que parece extraño y muy contrario a la intuición es este: ya que como dijiste Hibernate no intentará obtener conexión si no la necesita, ¿de qué sirve tener un método Session.isConnected()? ¿Debo haber intentado ya obtener una conexión de alguna manera para confiar en el valor de retorno de isConnected()?Si es así, entonces no lo necesito porque obtendré una excepción en el intento. No tiene sentido ... – Paralife

Cuestiones relacionadas