Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Ты должен.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top