terça-feira, 11 de setembro de 2007

Threads X Hibernate

Bom, tive o seguinte problema quando decide utilizar Threads no meu projeto Web para executar processos em modo batch:

  1. Quando as Threads estavão sendo executas acontecia exceções na session do Hibernate. Tudo isso porque eu tinha implementado "ThreadLocal" na minha Factory o que esta certo, e então quando as Threads entravam em processamento a Session não estava vinculada a mesma, porque a Thread foi instanciada e Startada por um processo do WebServer.
  2. Como Solucionar. Eu criei uma factory para ser utiliza unicamente pelas Threads que executão os processos em batch:
    1. Ficou assim HibernateFactoryThread que extends HibernateFactory: eu subescrevi quase tudo, exceto a SessionFactory que já esta instanciada na classe que esta sendo extendida.
      1. public class HibernateThreadFactory extends HibernateFactory {

        private static Logger log = Logger.getLogger(HibernateFactory.class);
        private static ThreadLocal sessions = new ThreadLocal();

        public static Session abreSessao(){
        if (sessions.get() != null){
        log.error("Essa Sessao nao foi fechada");
        }
        Session s = getFactory().openSession();
        //O metodo em vermelho é da Factory extendida.
        sessions.set(s);
        return s;
        }

        public static Session buscaSessaoCorrente(){
        if(sessions.get()!= null && sessions.get().isOpen()){
        return sessions.get();
        }
        return abreSessao();
        }

        public static void fechaSessao(){
        if(sessions.get().isOpen()){
        sessions.get().close();
        }
        }

        }
      2. Pronto agora é só utilizar nos metodos das Threads a HibernateThreadFactory.

Espero ter Ajudado, bom aproveito.

Nenhum comentário: