Spring + Hibernate-session-management über mehrere threads
Baue ich ein system, wo jeder request von einem client-Seite erzeugt mehrere threads auf der server-Seite. Jeder thread wird dann über einen oder mehrere DAOs (einige DAOs verwendet werden können, die von mehr als einem thread gleichzeitig die Zeit). Alle DAOs injiziert werden (@Autowired
) auf meine thread-Klassen von Spring. Jedes DAO erhält SessionFactory
eingespritzt.
Was wäre die richtige Art und Weise der Verwaltung der Hibernate-Sitzungen über diese mehrere DAOs, so würde ich keine Probleme haben, weil der Multithread-Umgebung (z.B. paar DAOs aus verschiedenen threads versuchen, die Verwendung der gleichen Sitzung zur gleichen Zeit)?
Wäre genug, dass ich angeben hibernate.current_session_context_class=thread
im Hibernate-Konfiguration und dann jedesmal, wenn in DAO verwenden Sie einfach SessionFactory.getCurrentSession()
um die Arbeit zu tun? Wäre es richtig zu erkennen und zu erstellen-Sitzungen pro thread als nötig?
InformationsquelleAutor der Frage Laimoncijus | 2012-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja. Es ist genug.
Beim einstellen
hibernate.current_session_context_class
zuthread
die session zurückgegeben, die vonSessionFactory.getCurrentSession()
ist von derThreadLocal
Instanz .Jeder thread seine eigenen, unabhängig
ThreadLocal
Instanz , so Verschieden threads wird nicht Zugang zu den gleichen hibernate-session .Das Verhalten von
SessionFactory.getCurrentSession()
ist, dass : wenn Sie zum ersten mal in den aktuellen thread, eine neue Sitzung geöffnet wird und zurückgegeben . Wenn es heißt, wieder in den gleichen thread , der gleichen session werden zurückgegeben.Als Ergebnis , können Sie erhalten die gleiche session verwenden, in verschiedenen DAO-Methoden in der gleichen Transaktion-code einfach durch Aufruf
SessionFactory.getCurrentSession()
. Es verhindert, dass Sie von der Weitergabe der Hibernate-session durch die DAO-Methode 's input-Parameter in dem Fall, dass Sie rufen viele verschiedene DAO-Methoden in der gleichen Transaktion-code .InformationsquelleAutor der Antwort Ken Chan