2011-01-13 10 views
4

Ich bin an einem Projekt arbeiten, das Hibernate3 und JDBC verwendet, um mit unserer Datenbank (MSSQL 2008)Hibernate Sessions und Transaktionen mit Themen

Derzeit erstellen wir unsere Sitzung Fabrik in unserer Klasse zu verbinden/interagieren dann unsere Transaktion beginnen , dann starten wir einen neuen Thread und dieser Thread schafft Verbindungen und was nicht. Ich werde sehen, ob ich das mit etwas Pseudo-Code illustrieren kann ...

public static main(String[] args){ 
    for(...){ 
     SessionFactory sf = new SessionFactory(); 
     sf.getCurrentSession.beginTransaction(); 
     CreateNewThreadedObject.run(); 
     sf.getCurrentSession.getTransaction.commit(); 
    } 
} 

Meine Frage ist, ist das sicher? Ich weiß, dass Sitzungen nicht threadsicher sind, aber ich benutze die Sitzung nicht wirklich im Thread. Wenn überhaupt, verwende ich die Transaktion. Wäre es besser, das Sessionfactory an das Thread-Objekt zu übergeben? Jeder Rat wird geschätzt!

+0

Wenn Sie eine Transaktion in dem erzeugten Thread verwenden (so dass die von thread ausgeführte Aktion Teil der in main ausgeführten Transaktion sein kann), kann dies fehlschlagen, da die Haupttransaktion es festschreiben kann, bevor der erzeugte Thread seine Arbeitseinheit beendet hat –

Antwort

2

Sie können eine Singleton-SessionFactory initialisieren. Das ist eigentlich zu empfehlen.

Dann sollte jeder Thread eine Sitzung mithilfe der Sitzungsfactory erstellen und eine oder mehrere Transaktionen durchführen.

Dies ist ein sehr häufiges Muster in Web-Anwendungen. Das Open-Session-in-View-Muster, das @kvista erwähnt, ist im Grunde ein Servlet-Filter, der eine Sitzung erstellt, eine Transaktion startet, an die Weiterverarbeitung der Anfrage delegiert und schließlich die Transaktion festschreibt oder rückgängig macht. Und da jede Anfrage von einem anderen Thread in einem Servlet-Container verarbeitet wird, können Sie sehen, wie nah die beiden Fälle sind.

In Ihrem Fall wäre es nicht unvernünftig, viele Transaktionen in jedem Thread auszuführen. Das ist eigentlich die Grundidee, Batch-Prozesse in einer Multi-Thread-Umgebung (idealerweise JTA) auszuführen. Eine Sache, die Sie beachten sollten, ist jedoch, dass die Sitzung tatsächlich ein Persistenzkontext ist, der als Cache fungiert, und Sie sollten es wahrscheinlich von Zeit zu Zeit löschen, um Speicherlecks zu vermeiden.

Verwandte Themen