Fechar conexões PostgreSQL x Hibernate

3 respostas
D

Olá pessoal,

Estive procurando no fórum e pelo que vi estou fazendo corretamente.
Porém estou abrindo este tópico para verificar se realmente estou fazendo corretamente ou é um bug mesmo.
Tentei das duas formas, conforme códigos abaixo:

public List<Estatus> getListaEstatus() throws Exception { List lista = null; try { SessionFactory sf = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); Session s = sf.openSession(); s.beginTransaction(); lista = s.createQuery("from Estatus").list(); s.beginTransaction().commit(); s.close(); } catch (Exception e) { throw e; } return lista; }

public List<Estatus> getListaEstatus() throws Exception { List lista = null; SessionFactory sf = null; Session s = null; try { sf = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); Session s = sf.openSession(); s.beginTransaction(); lista = s.createQuery("from Estatus").list(); s.beginTransaction().commit(); } catch (Exception e) { throw e; } finally{ s.close(); } return lista; }

O que ocorre é que tenho muitas conexões como esta e a cada consulta o postgre+hibernate abre uma conexão nova com uma nova thread nos processos.
Quero saber se estou realmente fechando as conexões corretamente e porque que as conexões continuam abertas.

Fiz um teste com select count(*) from pg_stat_activity e realmente a cada consulta vai abrindo novas consultas e não fechando.
No gerenciador de taferas ficam cada vez mais processos ativos do postgre.
Quando reinicio o tomcat as conexões são todas fechadas.

Aguardo.

3 Respostas

Gerson_da_S_Lima

Seguinte Denilson, nós temos alguns problemas com relação a essa sua implementação, mas vamos por partes.

1º Com relação as conexões continuarem abertas
A cada acesso ao banco você está criando uma nova sessionFactory e não está fechando, experimente fechar a sessionFacory. Mas aqui temos um outro problema,

2º Inicialização da sessionFactory.
Como eu disse antes, a cada acesso a banco você está criando uma nova sessionFactory, isso pode ser um problema, pois esse processo é muito custoso pra você ficar fazendo a toda hora, o ideal seria você iniciar a sessionFactory somente uma única vez, na inicialização do sistema por exemplo, imbutida em um HibernateUtil, HibernateHelper, como você quiser chamar, e a partir desse HibernateUtil abrir as sessões (openSession()). Dê uma pesquisado sobre HibernateUtil, que já tem bastante coisa.

3º O beginTransaction();
O trecho de código que você postou não necessita de transação, pois é somente uma consulta, transações nós só utilizamos quando estamos alterando algum dado no banco (insert, update, delete), por exemplo quando você vai iniciar um cadastro de algumas coisa, aí você dá o beginTransaction() aí quando o cara clicar em salvar, atualizar você dá o commit() e se acontecer algum erro ou o cara cancelar você dá um roolback().

Bem é isso, espero ter ajudado, qualquer outra dúvida posta aí…

D

Obrigado Gerson,

Esclareceu minha dúvida.
Estou fazendo um TCC e tenho pouco tempo para implementar o sistema.
Fiz um curso que ensina Frameworks J2EE e, como sempre, no curso não ensina os detalhes técnicos e melhores práticas.
Mas realmente tudo que voce disse faz sentido.
Vou adaptar meu sistema do modo que você falou e creio que resolverá meu problema.
Grato.

D

Gerson,

Só mais uma pergunta.
Caso eu decida iniciar uma SessionFactory e mante-la aberta, como faria para fechá-la?
Por exemplo, o usuario simplesmente fechou o browser, como interceptar isto e fechar a conexão?

Criado 3 de novembro de 2009
Ultima resposta 4 de nov. de 2009
Respostas 3
Participantes 2