2008-10-21 6 views
61

Я только что начал переносить свою внутреннюю структуру сохранения на JPA.Должен ли я закрывать() каждый EntityManager?

Учитывая, что каркасы персистентности скрывают большую часть сантехники, мне интересно знать, не закрывает ли EntityManagers объект EntityManagers, создающий утечку ресурса, или если структуры будут собирать и закрывать их для меня.

Я намерен во всех местах закрыть их, но есть ли у меня?

В настоящее время, используя TopLink, просто потому, что он работает с NetBeans легко, но я рад исследовать других поставщиков JPA.

+1

См. Также [Следует ли закрывать менеджера объектов JPA?] (Http://stackoverflow.com/q/10762974/697630) – 2013-08-12 12:41:53

ответ

71

Это зависит от того, как вы его получили.

Если вы создали его с помощью EntityManagerFactory, вам придется закрыть его независимо от того, какую структуру вы используете.

Если вы получили его с помощью инъекции зависимостей (например, с помощью аннотации EJB и @PersistenceContext), вы не должны закрывать его вручную (AFAIK вызывает RuntimeException).

+5

В более широком смысле EM все еще должен быть закрыт. Это просто работа, сделанная для вас EJB, и вы делаете это возможным, соблюдая требования EJB. – 2008-10-21 10:39:56

10

Вы должны.

Рамки не имеют представления о том, как вы собираетесь использовать EM, поэтому они не могут закрыть его (за исключением, может быть, при завершении, что не гарантируется). Да, не закрывая их, создается утечка ресурсов.

Идея такая же, как «всегда закрыть java.sql.Connection» (несмотря на то, что некоторые источники данных имеют настройки для автоматического закрытия их бездействия) или «всегда закрывать сеанс Hibernate».

Кроме того, если вы планируете писать переносимый код, вы не должны полагаться на конкретного поставщика JPA «умный» - другие могут не закрывать EM вовремя.

2

Я получил EntityManager с использованием @PersistenceContext аннотации в моем хранилище. Я вижу, что после того, как соединительные линии достигнут своего maxPoolSize, он не очищается.

Однако, если я создаю EntityManager с использованием EntityManagerFactory и звоните entitymanager.close(), тогда соединения очищаются. Я использую c3p0 в качестве библиотеки подключения.

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