Должен ли я закрыть () каждый EntityManager? - PullRequest
64 голосов
/ 21 октября 2008

Я только что начал миграцию своей доморощенной платформы персистентности в JPA.

Учитывая, что постоянные структуры скрывают много сантехники, мне интересно знать, если закрытие EntityManager'ов не создаст утечку ресурсов, или же эти структуры будут собирать и закрывать их для меня.

Я намерен во всех местах закрыть их, но ДОЛЖЕН ЛИ Я?

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

Ответы [ 3 ]

76 голосов
/ 21 октября 2008

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

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

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

11 голосов
/ 21 октября 2008

Вы должны.

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

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

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

4 голосов
/ 18 сентября 2012

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

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

...