2014-09-10 4 views
3

Я около 1 года разрабатываю системы в Java, используя JPA в качестве базы данных.

Каждый раз, когда я запрашиваю, я не закрывать EntityManager, IMO понимание, что JPA автоматически закрывает EntityManager после выполнения запроса, какДолжен ли администратор Entity закрывать каждый запрос?

getSingleResult() или getResultList()

Если нет, то сборка мусора будет собирать ее для утилизации?

ответ

8

Администраторы EntityManagers (те, которые вы получаете из EntityManagerFactory путем вызова emf.createEntityManager()) должны быть явно закрыты.

EDIT: вам не нужно закрывать EM после каждого запроса, но убедитесь, что вы завершите его перед возвратом из метода, который его создал. Общий подход заключается в том, чтобы внедрить EM в блок try/catch/finally, вызвав em.close(); в случае finally.

Если вы работаете с EntityManager с ограниченной транзакцией в контейнере, совместимом с Java EE, EntityManager создается контейнером во время транзакции и будет закрыт при завершении транзакции.

+0

Таким образом, при вызове createEntityManager EntityManager должен быть явно закрыт. Еще один вопрос, что вы имели в виду, работая с EntityManager с ограниченной транзакцией? –

+0

EntityManager, обработанный транзакциями, используется по умолчанию при работе с контейнерами Java EE, такими как JBoss или GlassFish. Самое приятное в них, что вам не нужно заботиться о своем жизненном цикле - просто запросите экземпляр и используйте его. [Этот пост] (http://piotrnowicki.com/2012/11/types-of-entitymanagers-application-managed-entitymanager/) прекрасно объясняет различия – kostja

+0

Привет, Костя. Каково следствие, если мы не закрываем entityManager? В приложении java ee есть способ обнаружить не закрытого менеджера сущностей? – soung

Смежные вопросы