Boa noite srs…
Tenho uma classe HibernateSessionFactory que faz a abertura da conexão da sessão do Hibernate. Para instanciar esse metodo uso assim na minha action.
...
Session session = HibernateSessionFactory().abrirSessao();
...
session.close();
O meu problema está em alguma excecção nao tratada na action que faz com que a sessão fique aberta. Pensei em utilizar um método finnalize na minha classe mais como o método é estático ele jamais será chamado. Como poderia resolver esse problema? Quais as possiveis soluções?
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
/**
*
* @author Giancarlo Rubio
* Factory do Hibernate
*/
public class HibernateSessionFactory {
/**
* Armazena o SessionFactory do hibernate
*/
private static SessionFactory factory;
/**
* Inicia o SessionFactory
*/
static{
buildFactory();
}
/**
* Abre a sessão com o hibernate
* @return Session aberta
*/
public static Session abrirSessao()
{
Session s =factory.openSession();
try {
//Roda uma query para verificar se está aberto a sessão
SQLQuery sq= s.createSQLQuery("SELECT now()");
sq.list();
//se der erro aguarda 1 segundo e tenta novamente
} catch (Exception ex){
Thread thr1 = Thread.currentThread();
try {
System.out.println("DORMINDO 1 segundo enquanto nao tenho conexao");
thr1.sleep(1000);
buildFactory();
s = factory.openSession();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return s;
}
/**
* Retorna o Sessionfactory
* @return SessionFactory
*/
public static SessionFactory getFactory() {
return factory;
}
/**
* Método que é chamado no objeto ServletInit para iniciar o hibernate
*/
public static void init(){}
private synchronized static void buildFactory(){
synchronized(HibernateSessionFactory.class) {
Configuration cfg = new AnnotationConfiguration();
cfg.configure();
factory = cfg.buildSessionFactory();
}
}
}