Boas práticas no uso dos EntityManagers

6 respostas
ganondorfan

Boa tarde,

estou tentando definir qual a melhor prática de uso dos EntityManagers, normalmente comenta-se muito sobre o padrão OpenSessionInView, entretando acho curioso como este padrão sempre fecha o EM. Digo isso pois ao que parece esse tipo de técnica desconsidera o uso das chamadas de atributos Lazy, ou mesmo o cache de objetos (já que o EM é um objeto procurador, proxy) do EM.

Normalmente quando se aluga um servidor, com exceção dos planos mais caros, tem-se um número limitado de conexões abertas com o banco, como também, banco de dados compartilhados e etc.

Seria uma boa prática manter um EM aberto durante toda a sessão do usuário? Ou talvez compartilhar um mesmo EM com vários usuários(sessões) durante a atividade de navegação?

Eu cheguei a implementar um cache de EM’s compartilhando cada EM com um número X de sessões abertas na minha aplicação WEB, entretanto esta aplicação ainda não está rodando, por isso não tenho resultados desta abordagem. Gostaria de saber do pessoal, qual as melhores práticas que vocês estão utilizando.

Outra dúvida minha, é com relação a vantagens e desvantagens do uso do EntityManager (JPA) X Session (Hibernate).

[]’ Paulo

6 Respostas

Hebert_Coelho

Cara, é pratica normal e não vejo como prejuízo em sempre fechar.

O livro q eu estou lendo agora fala que quando você deixa sua transação como JTA e utilizando EJB, a cada transação aberta um novo persistence context é criado. Quando a transação fecha aquele persistence context vai pro saco.

Não faz diferença. [=

Quanto ao Factory não vi problema nisso ainda em se deixar um cara só criado. Mas estou no começo do livro ainda. [=

leandronsp

Você não precisa se preocupar com esse cache de EM. Pode configurar um pool de conexões e automaticamente o EM vai buscar as conexões nesse pool.
Assim fica menos custoso e você pode ficar despreocupado em usar o OpenSessionInView :wink:

leandronsp

Se você deixar um EM por sessão de usuário, e caso tenha 500 usuários logados, serão 500 conexões abertas no banco. Não é legal…

Configure o pool e use o OpenSessionInView pra abrir e fechar uma conexão do pool a cada requisição.

ganondorfan

Na verdade na estratégia que descrevi, varias sessões compartilham de uma mesma EM aberta, ou seja, utilizam do mesmo canal.

G

deixa que o container gerencie isso por vc, pare de sofrer atoa.
https://docs.jboss.org/author/display/AS7/JPA+Reference+Guide
"// Transaction.commit will be called, Customer entity will be persisted to the database and “customerPU” persistence context closed"

Hebert_Coelho

gambazinho:
deixa que o container gerencie isso por vc, pare de sofrer atoa.
https://docs.jboss.org/author/display/AS7/JPA+Reference+Guide
"// Transaction.commit will be called, Customer entity will be persisted to the database and “customerPU” persistence context closed"
Desse modo ele perde o OpenSessionInView.

Eu prefiro como você citou e trazer todas as coleções por JPQL e nada de deixar o filtro tomar conta. ^^

OpenSessionInView pode gerar n+1 de consultas. =/

Criado 16 de junho de 2012
Ultima resposta 16 de jun. de 2012
Respostas 6
Participantes 4