HibernateUtil, Reaproveitar sessão ou não?  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
tassiocoelho
Entusiasta Java

Membro desde: 11/10/2008 20:02:58
Mensagens: 19
Offline

Amigos,

Estou a semanas lendo bastante sobre as formas de lidar com as sessões do Hibernate em ambientes web e mesmo após ler o batido link Open Session in View e Using Hibernate with Tomcat além de dezenas de posts em diversos fóruns não consegui chegar a uma conclusão satisfatória.

Vou mostrar as formas que vi as sessões sendo tratadas nas pesquisas que fiz e convido os colegas a darem suas opiniões sobre o que acham mais aconselhado.

OBS: Levem em consideração uma aplicação de grande porte com elevado número de acessos simultâneos.

Em relação a forma mais adequada de tratar as chamadas as sessões, transações e commits, concluí (mas posso estar enganado) que é através de um filtro.

Configurando o filtro no web.xml:



Implementação do HibernateSessionFilter:



O que desejo concluir é a melhor forma de retorno do método HibernateUtil.getSession()

1 - A primeira forma é fazer o HibernateUtil retornar uma nova sessão a cada chamada do método getSession():




Neste caso devemos acrescentar ao HibernateSessionFilter após o catch as linhas abaixo para que a sessão seja finalizada:




2 - A segunda maneira é usar o padrão ThreadLocal. Fiquei em dúvida se o Hibernate 3.2 já implementa nativamente ou não este padrão.
Não consegui compreender o funcionamento deste padrão. Se tudo é declarado como static concluo então que há apenas uma instância de ThreadLocal em toda aplicação e que em todos os momentos onde chama-se os métodos get ou set da ThreadLocal é referenciado um mesmo objeto do tipo ThreadLocal. Então porque utilizar o ThreadLocal e não o padrão Singleton simples, definindo apenas uma Session static?



3 - A terceira forma que encontrei mas não compreendi parece utilizar o mesmo padrão do item 2 porém já está implementado nativamente no Hibernate 3.2



É necessário acrescentar ao hibernate.cfg.xml a linha:




Resumindo:


1 - Utilizar o Filtro é a melhor forma ou não?
2 - É melhor abrir uma Sessão para cada requisição? Ou é melhor reaproveitar a mesma sessão?
3 - Construir uma única fábrica é o mais recomendado devido ao custo mas é recomendado utilizar uma única sessão para toda aplicação?
4 - E por fim e mais importante: Qual a melhor implementação do HibernateUtil e HibernateSessionFilter?


Espero que este POST gere uma grande quantidade de respostas pois servirá de ajuda para muitos.

Grande abraço a todos,
Tássio Coêlho








ono.leo
Thread.start()

Membro desde: 09/11/2009 15:09:45
Mensagens: 38
Offline

Olá, sei que já faz um tempinho, mas comecei a estudar o Hibernate a pouco tempo e atualmente estou tendo a mesma dúvida que voce escreveu acima. Como já faz algum tempo, será que voce já conseguiu esclarece-las ? Se sim, qual a conclusão que voce chegou ?
juniorsatanas
GUJ Master
[Avatar]

Membro desde: 20/05/2007 01:08:24
Mensagens: 1864
Localização: web2ajax@gmail.com
Offline

Olha eu uso de várias maneira, e agora to usando Facade !os 2 funcionam !

Cheque Mate em 6
[WWW] [Yahoo!] aim icon [MSN] [ICQ]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

Confesso q não li muito...

masss.... abra a session, e depois feche.... não reaproveite.... use C3P0 pra reaproveitar

Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
ivan.silva
Thread.start()
[Avatar]

Membro desde: 28/04/2009 08:10:15
Mensagens: 27
Offline

Olá Tássio,

Estou no mesmo dilema que você. Estamos implantando um sistema WEB de grande porte e estamos com problemas nas transações e ao reconetar no banco quando cai a conexão ou quando o DBA mata o serviço de banco.

Qual das 3 opções você utilizou?

A primeira de utilizar no Filter é um tanto quanto arriscada, pois ficará na sessão da aplicação e alguém pode fechar o browser sem deslogar.

A segunda é a que eu utilizo, mas precisa de melhorias.

A terceira estou tentando implementar mais nao estou conseguindo.

Voce pode me enviar seu HibernateUtil e sua configuração . cfg para eu ver como tu fez.

Att,
[Email] [MSN]
AdemirPinto
Thread.start()
[Avatar]

Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline

Lavieri wrote:Confesso q não li muito...

masss.... abra a session, e depois feche.... não reaproveite.... use C3P0 pra reaproveitar


Olá Lavieri, apesar do topico ser antigo, mas pra mim é atual...rss
Como assim, abra a sessão de depois fecha? Ser sua requisição tiver 10 inserts vc abriria 10 sessões e fechariam elas?

Obrigado
Ademir
[Email]
root_
JavaGuru
[Avatar]

Membro desde: 05/09/2006 15:46:19
Mensagens: 206
Localização: Gurupi - Tocantins
Offline

Essa é uma dúvida que tenho até hj, pq com EclipseLink, eu abro uma entityManager por View(FRame, internalFrame, Dialog.. etc..) e ela fica aberta até que a View seja fechada... assim realizando o controle de commit, begin e rollback das transacoes.

AGora com hibernate...?

Rogério Milhomens de Queiroz
Agile - Consultoria em Tecnologia da Informação!
http://www.agilecti.com.br
Dataview - Inteligência em Tecnologia!
http://www.dataview.com.br
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team