Dúvida Hibernate Session

Boa Tarde!

Eu novamente aqui … Essa vez são perguntas leves já que muitas conclusões tirei através de pesquisas… :roll: Já que não obtive respostas nos meus últimos post resolvi ler, ler, ler, revirei o fórum do GUJ atrás de respostas.Após mais de uma hora e meia de pesquisas cheguei a várias conclusões:

1 - O pool só habilita para reutilizar a conexão quando a sessão do hibernate é fechada.
2 - Portanto, se não fecho a sessão essa conexão não pode ser utilizada o que causa o travamento da aplicação.

Então, chego em outra questão: Como gerenciar essas sessões de maneira correta?

Também nas pesquisas pude obter respostas, e já percebi que utilizar a mesma sessão em todo contexto não é o ideal porque posso trabalhar com dados inválidos.

Chego agora numa questão que fiquei em dúvida, e não consigo achar nada muito concreto:

Utilizando o padrão ThreadLocal, estou reutilizando sessões que estão abertas “na memória”:


public List pesquisar () {
		
		try{
			
			this.session = HibernateUtil.getSessionFactory("").getCurrentSession();
			
			//faz alguma coisa...
			return this.session.createQuery("...").list();
			
		} catch( Exception e) {
			
			//faço alguma coisa
			
		} finally {
			
			//depois que usei a sessão para pesquisar eu fecho ela??
			//mesmo sabendo que se eu fechar a proxima vez que chamar current session
			//ela precisará ser aberta, e teria o mesmo efeito que abrir a sessão toda vez?
			this.session.close();
			
		}
		
		return null;
		
	}

Ou Abrindo toda vez e fechando no finally


public List pesquisar () {
		
		try{
			
			this.session = HibernateUtil.getSessionFactory("").openSession();
			
			//faz alguma coisa...
			return this.session.createQuery("...").list();
			
		} catch( Exception e) {
			
			//faço alguma coisa
			
		} finally {
			
			
			this.session.close();
			
		}
		
		return null;
		
	}

Obs: Com a opção de abrir toda vez sei que posso ter erro de LazyInitialization

Depois de falar… falar… falar… queria chegar nesse ponto:

DÚVIDA ABAIXO:

Já sei que abrir sessão não é muito custoso então pode ser feito.Porém abrindo e fechando toda vez estou “com medo” de tomar muitas exceções (já tentei fazer e resolvi usar uma sessão no contexto) como LazyInitialization, Session closed, …
E mantendo sempre a mesma as vezes ficam objetos no cache.

1 - O que é melhor gerenciar essa sessão usando ThreadLocal e mantendo ela no contexto da session factory (reutilizando) ou então toda vez abrir e fechar?
2 - Se eu utilizar essa mesma sessão no contexto do session factory preciso fechar ela no finally ( porque percebi pelo profiler que se deixo ela aberta ela é reutilizada, e inicia uma nova com o transation - faz um flush e um close -. Porém se eu fechar ela estará se comportando do mesmo modo que eu abrisse e fechasse toda vez? )

Pelo pouco tempo que andei mexendo com o hibernate, percebi que abrir e fechar toda vez é melhor, faz vc perder menos cabelos e aumenta sua estimativa de vida, é o que eu acho.

Consegui resolver meus problemas de connection leak. Obrigado a todos (poucos) que tentaram me ajudar :smiley:

Rafael,

Posta aí a solução… estou com consumo de memoria devido a conexões que naõe stão se fechando… mesmo eu mandando!

Rafael, faça a gentileza de postar a solução, obrigado!

[]'s

Não tem uma solução unica e genérica. Abram um novo tópico com o problema que posso ajudar. (Realmente é um problema bem chato de resolver).

Algo que ajudou:

1)Baixem o Hibernate Profiler ( http://hibernateprofiler.com/ ).

E verifiquem se todas as sessões que são abertas foram fechadas. Percebi que se a sessão fica aberta o mysql não libera (prende) essa conexão do pool para ser utilizada.