Entendendo melhor boas práticas - EntityManager

4 respostas
israel.fonseca

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.

4 Respostas

L

Eu havia respondido uma pergunta parecida em http://www.guj.com.br/posts/list/114142.java#616766 , talvez dê uma clareada.

agodinho

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.

israel.fonseca

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. :smiley:

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?

L

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.

Criado 22 de janeiro de 2009
Ultima resposta 22 de jan. de 2009
Respostas 4
Participantes 3