2016-08-12 3 views
0

내 프로젝트에서 나는 최대 절전 모드를 사용한다. 내가 처음 (문자열 일) 메소드 addToDatabase를 호출 할 때SessionFactory 객체를 생성하는 방법

public class DatabaseWorker { 

    static SessionFactory sessionFactory = null; 

    static { 
     try{ 
      sessionFactory = new Configuration().configure().buildSessionFactory(); 
     }catch (Throwable ex) { 
      System.err.println("Failed to create sessionFactory object." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static void addToDatabase(String something) { 
     /... 
    } 
} 

그것은 sessionFactory에 생성 될 필요가 있기 때문에 실행하는 데 시간이 오래 걸립니다 : 나는 서버 측에 다음과 같은 클래스를 사용하여 데이터베이스와 상호 작용합니다. 첫 번째 쿼리 전에 sessionFactory를 만들 수있는 방법이 있습니까?

+0

이 도움이 될 수 있습니다 당신 http://stackoverflow.com/questions/7986750/create-session-factory-in-hibernate-4 – Abhishek

+0

에서 시작시로드 값을 사용하여 서버가 시작될 클래스를로드 수코양이 –

답변

0

응용 프로그램을 부팅하는 동안 세션 팩토리를 초기화하면 다른 작업의 대기 시간이 늘어납니다. 응용 프로그램을 닫는 동안 닫습니다. 응용 프로그램의 첫 번째 요청 중에 세션 팩토리 초기화 부분을 두지 마십시오.

0

db 쿼리가 응용 프로그램에서 가장 먼저 수행하지 않는다고 가정하면 백그라운드에서 별도의 스레드에 세션 팩토리를 빌드 할 수 있습니다.

코드를 정적 블록으로 초기화하지 마십시오. 싱크 코드를 구성하는 방법에 따라 일반적인 단일 톤 구현을 사용하거나 다음과 같이 간단한 미래 객체를 사용할 수 있습니다.

static FutureTask<SessionFactory> sessionCreatedFutureTask = 
    new FutureTask<SessionFactory>(new Callable<SessionFactory>() { 
     @Override 
     public SessionFactory call() throws Exception { 
      //initialize your SessionFactory 
      return sessionFactory; 
     } 

}); 



public static void main(String[] args) { 
    new Thread("sessioncreator") { 
     public void run() { 
      sessionCreatedFutureTask.run(); 
     } 
    }.start(); //Or put this to threadpool if u have any relevant common pool 
    ... 
    ... 
} 

public static void addToDatabase(..) { 
    try { 
     //get session factory and use it. 
     SessionFactory sessionFactory = sessionCreatedFutureTask.get(); 
    } catch (InterruptedException | ExecutionException e) { 
    } 
} 
관련 문제