2016-08-12 15 views
0

私のプロジェクトでは、Hibernateを使用しています。データベースと対話するために、私は、サーバー側で次のクラスを使用します。私は初めてaddToDatabase(文字列何か)メソッドを呼び出すときのSessionFactoryを作成する必要があるため、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を作成する方法はありますか?

+0

これが役立つことがありますhttp://stackoverflow.com/questions/7986750/create-session-factory-in-hibernate-4 – Abhishek

+0

でのload-on-startup値を使用して、サーバが起動されたクラスをロードします風刺 –

答えて

0

アプリケーションの起動中にセッションファクトリを初期化すると、他のアクションの待ち時間が長くなります。アプリケーションを閉じている間に閉じます。アプリケーションの最初の要求時に、セッションファクトリの初期化部分を置かないでください。

0

dbクエリーがアプリケーションで最初に実行されるわけではないと仮定すると、セッションファクトリをバックグラウンドの別のスレッドに構築できます。

このコードを静的ブロックで初期化するようにしないでください。シンクロナイズするためには、どのようにurコードが編成されているかに応じて、典型的な1トンの実装を使用するか、次のように単純な将来のオブジェクトを使用します。

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) { 
    } 
} 
関連する問題