Должен ли я закрыть () каждый EntityManager?


Я только что начал переносить свою доморощенную структуру персистентности в JPA.

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

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

на данный момент с помощью TopLink, просто потому, что он работает с NetBeans легко, но я рад расследование других провайдеров СПД.

3 64

3 ответа:

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

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

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

вы должны.

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

идея такая же, как "всегда закрыть java.язык SQL.Подключение "(Несмотря на то, что некоторые источники данных имеют настройки для их автоматического закрытия из-за бездействия) или"всегда закрывать сеанс гибернации".

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

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

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