좋아요, 기사/예제를 통해 싱글 톤으로 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가 왜 그렇게 나쁜 싱글 톤이되어야합니까 ??? 동시성 문제에 대해서는 읽었지만 다중 스레드 문법을 경험하지 못했기 때문에이 아이디어에 대해 명확히 알 수는 없습니다.
"왜 EMF가 싱글 톤이되어야합니까?" 이 문은 아마 다른 질문을 열어야합니다 .... –