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? )
