2013-07-02 4 views
2

이 질문은 Keeping JPA EntityManager open?이지만이 문제는 여전히 남아 있습니다.항상 EntityManager를 엽니 다.

응용 프로그램 수명 동안 항상 EnityManager를 열어 두는 것이 좋습니다. 데이터베이스 연결과 같은 자원을 소비합니까? 엔티티를 유지합니까 아니면 약한 참조를 사용하면 엔티티를 해제할까요? EclipseLink 2.x를 사용합니다.

감사

Zlaja은

답변

2

는 EntityManager를 오히려 단명 할 수 있도록 설계되었다. 곧 오랫동안 열어 유지하지만, 기술적으로 가능하다 이상 다음과 같은 문제에 직면하게 될 것이다 : 당신이 엔티티로드 계속 EnityManager 썼던 것처럼

  1. 를 실제로 그것은에서 (약한 참조를 사용하여 유지 적어도 Hibernate를 가지고 있지만 이것이 JPA 스펙에 의해 요구되는지 확실하지 않다.). 그래서 그들은 JVM이 메모리가 부족해지기 전에 해제되어야한다. 불행하게도 많은 수의 엔티티를 유지하는 것이 EM 성능에 영향을받는 것을 보았습니다. 숫자가 커지면 (부정적 일 수 있습니다).

  2. 오픈 EM 수 있습니다 , 예 : 메모리에 지연로드 가능한 객체가있을 때.

  3. EM 정의에 의해 은 thread-safe이 아니므로 웹 응용 프로그램에서 (예를 들어) 한 인스턴스를 재사용/공유하는 것은 완전히 용납되지 않습니다.

  4. 는 아마 가장 큰 문제는 (때문에 DB 제약의 위반 커밋 예. 거래에) EM에서 발생하는 모든 오류있을 때, JPA는 EM 최대한 빨리을 폐쇄하고 폐기해야해야한다는 것입니다. 이렇게하면 메모리에있는 모든 엔티티가 분리 상태가됩니다. 즉, 지연로드 된 콜렉션/참조를 만지면 실패합니다. 이를 해결하기위한 방법은 모든 엔티티를 다시로드하는 것이지만 응용 프로그램 계층 전체에 흩어져있는 큰 응용 프로그램에서는 어렵습니다. 이에 대한 해결책은 분리 된 개체로 작업을 시작하고 EntityManager.merge()을 사용하는 것입니다. 그러나 이것은 대개 프로그래밍 모델을 변경해야하며 특히 "항상 열려있는"엔티티 관리자 접근 방식과 모순됩니다. 하나의 접근법 만 사용하고이를 준수해야합니다.

일반적으로 EntityManager을 짧게 유지하는 것이 좋습니다. 실제로 많은 것을 단순화합니다.

+0

# 1은 EclipseLink에 해당하며 ReferenceMode를 사용하여 구성 할 수 있습니다. http://www.eclipse.org/eclipselink/api/2.3/org/eclipse/persistence/config/ReferenceMode.html – Chris

+0

읽기 # 4 - 컨텍스트가 여전히 사용 가능할 때까지 지연 관계를 트리거 할 수있는 EclipseLink에서는 그렇지 않습니다. 엔티티가 직렬화되거나 팩토리가 닫힌 경우에만 사용할 수 없습니다. – Chris