| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/01/2009 08:54:20
|
israel.fonseca
JavaBaby
![[Avatar]](/images/avatar/b3d2a9a2985c5a32c669cc33c885e6c8.png)
Membro desde: 13/10/2007 15:11:19
Mensagens: 88
Localização: Tubarão - SC
Offline
|
Olá, estou estudando mais sobre persistencia em um ambiente web (Desenvolvo com Seam + Tomcat), e recentimente me deparei com uma dúvida: Porque exatamente é uma heresia manter um entityManager com escopo de session?
Eu sei que as conexões devem ser usadas por tempos curtos para compartilhar com outros acessos, mas a conexão é aberta e fechada automaticamente no inicio/término de uma requisição. Então depois que ela fecha não quer dizer que ela já está disponivel?
Ou um entitymanager tem UMA conexão, e mesmo que ela esteja fechada, essa conexão ainda é dele, logo o recurso ainda não foi disponibilizado para as outras pessoas. O que eu sei de problema em se usar um entityManger com escopo de sessão, é que o cache dele vai subindo infinitamente até estourar.
Em fim tenho bastante dúvidas a respeito disso, e queria alguma leitura bem técnica sobre conexões/JPA/EntityManager para eu conseguir visualizar porque as coisas são ou não são recomendadas.
|
http://israelfonseca.blogspot.com/ |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/01/2009 09:06:04
|
Leonardo3001
GUJ Ranger
Membro desde: 04/07/2007 18:28:58
Mensagens: 975
Offline
|
Eu havia respondido uma pergunta parecida em http://www.guj.com.br/posts/list/114142.java#616766 , talvez dê uma clareada.
|
Leonardo Veríssimo
-------------------------------------------------
Objectzilla |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/01/2009 09:15:30
|
agodinhost
Virtual Machine Man
![[Avatar]](/images/avatar/b8ffa41d4e492f0fad2f13e29e1762eb.jpg)
Membro desde: 28/03/2006 21:19:16
Mensagens: 590
Localização: RJ, Tijuca
Offline
|
israel.fonseca wrote:mas a conexão é aberta e fechada automaticamente no inicio/término de uma requisição.
Não sei qto ao EntityManager mas isso aí não parece correto. Abrir e fechar uma conexão é muito caro do ponto de vista de recursos e normalmente se usa um pool de conexões. Vc normalmente "pede" a conexão do pool e, ele sim, gerencia o tempo de "vida" da bichinha.
|
"The difference between theory and practice is that, in theory, there is no difference between theory and practice". |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/01/2009 09:29:30
|
israel.fonseca
JavaBaby
![[Avatar]](/images/avatar/b3d2a9a2985c5a32c669cc33c885e6c8.png)
Membro desde: 13/10/2007 15:11:19
Mensagens: 88
Localização: Tubarão - SC
Offline
|
Opa, vlw Leonardo, foi eu mesmo que havia feito esse outro tópico. É que minha duvida continuou e quis colocar ele aqui no fórum mais especifico.
Agora uma coisa que me confundi, parece que uma transação é iniciada no inicio de cada requisição e terminada, não uma conexão. Hmm, então realmente acho que a conexão fica com o entityManager o tempo que ele se mantem vivo, por isso seria não recomendável deixar ela como sessão. Hmm está certo isso?
|
http://israelfonseca.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/01/2009 11:04:57
|
Leonardo3001
GUJ Ranger
Membro desde: 04/07/2007 18:28:58
Mensagens: 975
Offline
|
Assim como eu tenho Session (ou EntityManager) que fica em cima da Connection, também tenho a transação do framework de persistência (ORM) e a transação da conexão.
Normalmente, a duração da transação da Session, assim como a duração da transação da Connection são as mesmas. Porém, muita gente já se deparou com a LazyInitializationException na hora de iterar uma lista na view. Por causa disso, criou-se o Open Session in View para que a transação da Session seja aumentada, indo do início ao fim da requisição. No caso, a Connection é pegada mais cedo e liberada no último segundo.
Alguns ainda, sentiram necessidade de ampliar ainda mais o escopo da Session, o popularmente conhecido Conversation que, como havia dito antes, usa Connections novas para cada requisição, mas sempre usando a mesma Session. Porém, ainda assim é preciso garantir integridade transacional, e, por causa disso, a Session também faz parte de uma transação, só que não relacionada à transação do banco, que está sobre os cuidados da Connection. Ou seja, a transação da Session é uma coisa só dele, implementado pelo Hibernate, que nada tem a ver com a transação do banco.
|
Leonardo Veríssimo
-------------------------------------------------
Objectzilla |
|
|
 |
|
|
|
|