2010-12-28 4 views
24

좋아요, 기사/예제를 통해 싱글 톤으로 Entity Manager Factory를 작성하는 방법을 읽었습니다. 나를 위해 쉬운 그들의언제 EntityManagerFactory 인스턴스를 생성/열어야합니까?

하나는 조금 이해하기 :

http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html

나는 의 EntityManagerFactory (EMF)이 전용 응용 프로그램 범위에 한 번, 바람직하게 작성해야합니다 것을 배웠다.

public class EmProvider { 

    private static final String DB_PU = "KogaAlphaPU"; 

    public static final boolean DEBUG = true; 

    private static final EmProvider singleton = new EmProvider(); 

    private EntityManagerFactory emf; 

    private EmProvider() {} 

    public static EmProvider getInstance() { 
     return singleton; 
    } 


    public EntityManagerFactory getEntityManagerFactory() { 
     if(emf == null) { 
      emf = Persistence.createEntityManagerFactory(DB_PU); 
     } 
     if(DEBUG) { 
      System.out.println("factory created on: " + new Date()); 
     } 
     return emf; 
    } 

    public void closeEmf() { 
     if(emf.isOpen() || emf != null) { 
      emf.close(); 
     } 
     emf = null; 
     if(DEBUG) { 
      System.out.println("EMF closed at: " + new Date()); 
     } 
    } 

}//end class 

그리고 내 방법을 EmProvider을 사용하여 : : (?) 비즈니스 방법을 사용할 수 있도록 또한

그리고 그것은 사용되는 일단 EMF를 닫 확인

그래서 나는 EMF 헬퍼 클래스를 작성

public String foo() { 
    EntityManager em = null; 
    List<Object[]> out = null; 
    try { 

     em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); 
     Query query = em.createNativeQuery(JPQL_JOIN); //just some random query 
     out = query.getResultList(); 
    } 
    catch(Exception e) { 
     //handle error.... 
    } 
    finally { 
     if(em != null) { 
      em.close(); //make sure to close EntityManager 
     } 
     //should I not close the EMF itself here????? 
     EmProvider.getInstance().closeEmf(); 
    } 

제안 된대로 메소드 레벨 내에서 EntityManager (em)를 닫아야합니다. 하지만 언제 EntityManagerFactory를 종료해야합니까? 그리고 EMF가 왜 그렇게 나쁜 싱글 톤이되어야합니까 ??? 동시성 문제에 대해서는 읽었지만 다중 스레드 문법을 경험하지 못했기 때문에이 아이디어에 대해 명확히 알 수는 없습니다.

+1

"왜 EMF가 싱글 톤이되어야합니까?" 이 문은 아마 다른 질문을 열어야합니다 .... –

답변

51
  • EntityManagerFactory 인스턴스는 중량 개체입니다. 각 공장 은 메타 데이터 캐시, 개체 상태 캐시, EntityManager 풀, 연결 풀 등을 유지 관리 할 수 ​​있습니다. 응용 프로그램에 EntityManagerFactory가 더 이상 필요하지 않으면 을 닫아 이러한 리소스를 해제해야합니다. 모든 엔티티 그 공장, 에서와 확장에 의해

  • 의 EntityManagerFactory가 종료

    , 모든 EntityManagers이 유효 가되고, 그 EntityManagers에 의해 관리.

  • 반복에 보다 더 오랜 기간 동안 열려 공장 을 계속 만들고 새로운 공장을 폐쇄하는 것이 훨씬 낫다. 따라서 대부분의 응용 프로그램 은 응용 프로그램이 종료 될 때 이 종료되면 공장을 닫지 않으며 만 닫습니다. 다른 구성으로 여러 공장을 필요로

  • 만 응용 프로그램은 만들 수있는 명백한 이유 와 가까운 여러 의 EntityManagerFactory 인스턴스가 있습니다.

  • 하나의 EntityManagerFactory

    는 각 배포 지속성 부 구성에 만들어 질 수있다. EntityManager 인스턴스의 수는 주어진 팩토리에서 생성 된 일 수 있습니다.

  • 하나 이상의 엔티티 관리자 팩터 리 인스턴스가 JVM에서 동시에 사용 가능할 수 있습니다 ( ).EntityManagerFactory 인터페이스의 메소드는 스레드 세이프입니다.
+3

'EntityManagerFactory'는 온라인 웹 응용 프로그램에 대해 닫히지 않아야한다고 생각합니다. – abbas

+1

웹 응용 프로그램이 중지되거나 (사용자가 웹 응용 프로그램을 중지하거나 배포 취소 할 때) 닫아야합니다. 예제 : JSF 사용시 ServletContextListener 인터페이스에서 contextDestroyed 메소드 구현하기 – GabrielBB

+1

@ pvm14 예, 맞습니다. 만약 당신의 길을 가야만하고 & 문서에있는 모든 것과 모든 사람들이 이해한다면, stackoverlow는 그림에 들어 가지 않을 것입니다. 사람들은 불필요하게 투표하지 않았습니다. 마음에 들지 않으면 떠나라. 부적절한 댓글을 남기지 말고 정보, 세부 정보, 실수 등을 추가하여 가능한 경우 모두에게 도움이 될 수 있도록 노력하십시오. –

관련 문제