Foros del Web » Programación para mayores de 30 ;) » Java »

Reconexion en Hibernate

Estas en el tema de Reconexion en Hibernate en el foro de Java en Foros del Web. Hola a todos, la cuestion es la siguiente: cuando ocurre algun error con el motor de base de datos, como por ej perder la conexion, ...
  #1 (permalink)  
Antiguo 15/07/2010, 10:37
Avatar de francopai  
Fecha de Ingreso: agosto-2008
Mensajes: 42
Antigüedad: 15 años, 7 meses
Puntos: 2
Reconexion en Hibernate

Hola a todos, la cuestion es la siguiente: cuando ocurre algun error con el motor de base de datos, como por ej perder la conexion, hibernate no vuelve a reconectar, por ej. si al medio de una consulta reinicio el servicio de mysql, cuando continua la ejecucion, Hibernate no reconecta ni tampoco puede hacer rollback.
Segun lei en la documentacion, a Hibernate hay que pedirle solo Sessions y el se encarga de las conexion, pero evidentemente no es asi. Dejo mi codigo a continuacion a ver si alguien me puede tirar una idea de como correjirlo.

Muchas Gracias

Mi clase HibernateUtil:

public class HibernateUtil {

private static SessionFactory sessionFactory;

public static void createSessionFactory() {
String url = "jdbc:mysql://" + mihost + ":"
+ miPuertoHost + "/" + miBDname;

sessionFactory = new Configuration()
.configure("/sic/modelo/hibernate/hibernate.cfg.xml")
.setProperty("hibernate.connection.url", url)
.setProperty("hibernate.connection.username", miUser)
.setProperty("hibernate.connection.password", miPass)
.buildSessionFactory();
}

public static void conectar() {
createSessionFactory();
}

public static void desconectar() {
if (!sessionFactory.isClosed()) {
sessionFactory.close();
}
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}


Una metodo en el cual hago uso de Hibernate:

public Usuario getUsuarioPorNombre(String nombreNuevo) throws HibernateException {
HibernateUtil.conectar();
Session session = HibernateUtil.getSessionFactory().openSession();

try {
session.beginTransaction();

//Todas las operaciones necesarias...

session.getTransaction().commit();
return usuario;

} catch (RuntimeException ex) {
session.getTransaction().rollback();
throw ex;

} finally {
session.close();
HibernateUtil.desconectar();
}
}

Última edición por francopai; 15/07/2010 a las 12:10
  #2 (permalink)  
Antiguo 15/07/2010, 13:41
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Reconexion en Hibernate

No es un problema de hibernate en sí, si no del pool de conexiones que utilices por debajo de Hibernate, que puede ser el propio simple-pool de Hibernate (que ellos mismo dicen que no es gran cosa), el C3P0, un datasource de tu servidor de aplicaciones...

Una vez dicho esto, la mayoría de pools llevan muy mal lo de las BDD inestables y no se reconectan después de un fallo gordo. En nuestro caso, el único pool que conozco que lo hace es el nuestro propio por que tuvimos una temporada con muchos problemas de conectividad y lo tuvimos que hacer nosotros o tirarnos por un puente. Pero no se puede usar debajo del Hibernate así que no sirve para este caso.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 15/07/2010, 14:09
Avatar de francopai  
Fecha de Ingreso: agosto-2008
Mensajes: 42
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Reconexion en Hibernate

Muchas Gracias por tu respuesta, entonces para tratar de evitar esta situacion, que manera de conectar me recomiendas? conectar al inicio de la aplicacion y mantener abierta e ir sacando nuevas Sessions ó conectar y desconectar por cada consulta, tal cual esta en el codigo antes posteado? Consulto esto porque en el ultimo caso, le cuesta bastante tiempo reconectar cuando llamo a createSessionFactory().

Gracias!
  #4 (permalink)  
Antiguo 16/07/2010, 01:14
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Reconexion en Hibernate

La "solución" es buscar un pool de conexiones que se comporte bien en ese tipo de circunstancias y configurarlo para que el Hibernate lo use .

Una alternativa sería tener un proceso que probando las conexiones de BDD periodicamente y cuando detectara que no se puede conectar, reiniciara todo al volver a detectar la BDD en funcionamiento. Pero programar eso no es sencillo.

El problema es que si el pool no se reconectar, reiniciar Hibernate puede no servirte de mucho ya que lo más que conseguirás es que el pool le conteste que no hay conexiones disponibles.

Nosotros ahora mismo las aplicaciones con Hibernate nos dan problemas si el servidor de BDD falla temporalmente, pero como no son críticas no es un tema prioritario. Tengo en la cola de tareas pendientes modificar el pool nuestro para poder usarlo como DataSource, pero esta muy muy abajo en la lista de prioridades .

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 16/07/2010, 15:08
Avatar de francopai  
Fecha de Ingreso: agosto-2008
Mensajes: 42
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Reconexion en Hibernate

Gracias GreenEyed por tu aporte, para serte sincero, ahora quedé con mas dudas que antes, pero entiendo que no es un tema sencillo de tratar segun estuve leyendo opiniones en otro lugares.
Creo que voy a dejar tal cual indica la doc de Hibernate, una sola conexion "static" e ir abriendo y cerrando Sessions y en caso de que se produzca algun error importante, pedir amablemente al usuario que reinicie la aplicacion, no le veo otra salida a esto.
Gracias nuevamente por tu tiempo, cualquier opinion al respecto es bienvenida

Saludos

Etiquetas: hibernate
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:59.