Pergunta

Eu apenas comecei a migração meu framework de persistência homegrown para JPA.

Dado que os frameworks de persistência esconder um monte de encanamento, eu estou interessado em saber se não fechar EntityManagers criará um vazamento de recursos, ou se os quadros irá recolher e fechá-los para mim.

Eu pretendo em todos os lugares para fechá-las, mas eu tenho que?

No momento usando TopLink, só porque ele funciona com o NetBeans facilmente, mas estou feliz para investigar outros provedores de JPA.

Foi útil?

Solução

Depende de como você obteve.

Se você criou usando EntityManagerFactory você terá que fechá-lo não importa o quadro que você usa.

Se você obteve-o usando a injeção de dependência (por exemplo, usando EJB e anotação @PersistenceContext) você não deve fechá-lo com a mão (AFAIK ele fará com que RuntimeException).

Outras dicas

Você deveria.

Frameworks não tem idéia de como você pretende usar o EM, de modo que não pode fechá-la (exceto, pode ser, na finalização, o que não é garantido). Sim, não fechá-las criaria um vazamento de recursos.

A idéia é o mesmo que "sempre perto java.sql.Connection" (apesar de algumas fontes de dados têm configurações para fechá-las automaticamente por inatividade) ou "sessão sempre perto Hibernate".

Além disso, se você planeja escrever código portátil, você não deve confiar em provedor de JPA específico "ser inteligente" - outro pode falhar para fechar a EM em tempo

.

Obtive EntityManager usando anotação @PersistenceContext no meu repositório. Eu posso ver que, após os connectionpools atinge o seu maxPoolSize não se limpar.

No entanto, se eu criar EntityManager usando EntityManagerFactory e chamada entitymanager.close() então conexões estão sendo limpos. Eu estou usando c3p0 como biblioteca ConnectionPool.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top