2016-08-12 3 views
0

In meinem Projekt verwende ich Hibernate. Für die Interaktion mit der Datenbank verwende ich folgende Klasse auf Server-Seite:So erstellen Sie das SessionFactory-Objekt

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) { 
     /... 
    } 
} 

Wenn ich addToDatabase (String etwas) Methode zum ersten Aufruf dauert es eine lange Zeit auszuführen, da session ist müssen erstellt werden. Gibt es eine Möglichkeit, SessionFactory vor der ersten Abfrage zu erstellen?

+0

dies kann Ihnen helfen, http://stackoverflow.com/questions/7986750/create-session-factory-in-hibernate-4 – Abhishek

+0

die Klasse laden, wenn der Server gestartet wird, mit load-on-Start-Wert in Kater –

Antwort

0

Die Initialisierung der Sitzungsfactory während des Anwendungsstarts erhöht die Latenz in anderen Aktionen. Und schließen Sie es, während Sie Ihre Anwendung schließen. Fügen Sie den Initialisierungsabschnitt für die Sitzungsfactory nicht während der ersten Anforderung Ihrer Anwendung ein.

0

Angenommen, db-Abfrage ist nicht das erste, was Sie in der Anwendung tun, können Sie die Sitzungsfabrik in einem separaten Thread im Hintergrund erstellen.

Setzen Sie diesen Code nicht in statischen Block initialisieren. Um zu synchronisieren, können Sie, abhängig davon, wie der Ur-Code organisiert ist, entweder eine typische Ein-Tonnen-Implementierung verwenden oder ein einfaches Zukunftsobjekt wie folgt verwenden.

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) { 
    } 
} 
Verwandte Themen