Finnalize em metodo statico

0 respostas
G

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(); 
		}
	}
}
Criado 17 de outubro de 2011
Respostas 0
Participantes 1