2008-10-28 13 views
12

Ich hatte eine Methode mit einer Vielzahl von Persistenz-Anrufe, die eine nHibernate Sitzung verwendet, es hat funktioniert, war in Ordnung. Aber ich musste diese Methode umgestalten und eine Methode aus Multithread-Gründen aus einem Inhalt innerhalb einer Schleife extrahieren. Dann habe ich mit dieser Methode eine Klasse erstellt. Es ist wie bei einem normalen Refactoring, aber die nHibernate-Sitzung innerhalb dieses Methodenaufrufs ist unterbrochen, ohne Kontext, ich habe sie nicht zu irgendeinem Zeitpunkt abgeschlossen. Hat nHibernate Probleme mit Multithreading? Auch wenn ich nur noch einen Thread ausführe, habe ich das selbe Problem.nHibernate Sitzung und Multithreading

Ich benutze nHibernate Session durch ein SessionFactory und Façal Pattern, dh die Session ist kein Feld dieser Objekte, sie ist global in SessionFactory.


es ein wenig klarer zu machen:

VOR:

Method() 
{ 
... persistence calls 
foreach(Thing..) 
{ 
...persistence calls for each thing (1) 
} 
... 
} 

NACH:

Method() 
{ 
... persistence calls 
foreach(Thing..) 
{ 
create a thingResolver object with some data 
open a new thread with thingResolver.Method (1) 
starts this thread 
} 
.. waits for finishing threads and continues 
} 

Unsere nHibernate Session Factory ist Thread-aware und speichert/ruft die nHibernate-Sitzung pro Thread ab. Es funktioniert gut jetzt;)

Antwort

17

Sessions sind nicht sicher in NHibernate nach Design fädeln. Also sollte es in Ordnung sein, solange Sie eine Sitzung nur von einem Thread verwendet haben.

Ich bin nicht sicher, was Sie thingResolver tut, aber wenn es einige persistance fordert die gleiche Sitzung hat Sie in den Ursprungs Thread erstellt haben - diese höchstwahrscheinlich die Ursache Ihrer Probleme, könnten Sie erstellen eine separate Sitzung in Ihrem neuen Thread, so dass es eine Sitzung pro Thread wäre, wenn meine Annahme wahr ist.

NHibernate Referenz hat es in Abschnitt 10,2

http://nhibernate.info/doc/nh/en/index.html#transactions

+0

danke Aleksey. Ich werde Probleme haben, es zu tun (arbeite mit einer anderen Sitzung), da es gegen mein Design verstößt, denke ich darüber nach, dieses Multithread-Ding zu fälschen. –

+0

in der Tat ist meine Sitzungsfactory robust und kann eine Sitzung pro Thread beibehalten, funktioniert: D –

+1

Aktualisierter Link zur Dokumentation http://nhforge.org/doc/nh/en/index.html#transactions – AlfeG