2008-10-28 14 views
12

Miałem metodę z wieloma wyzwalaczami, które używały sesji nHibernate, działało, było w porządku. Ale musiałem zreorganizować tę metodę, wyodrębniając metodę z zawartości wewnątrz pętli, z powodów wielowątkowych. Potem stworzyłem klasę tą metodą. To jest jak normalna refaktoryzacja, ale sesja nHibernate w tym wywołaniu metody jest zerwana, bez kontekstu, w żadnym momencie jej nie sfinalizowałem. Czy występują problemy z wielowątkowością? Nawet gdy mam tylko jeszcze jeden wątek, mam ten sam problem.nHibernate session i wielowątkowość

Używam sesji nHibernate poprzez wzorzec SessionFactory i Façade, to znaczy, sesja nie jest polem tych obiektów, jest globalna w SessionFactory.


czyni go nieco bardziej jasne:

PRZED:

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

PO:

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 
} 

Nasza nHibernate Session Factory jest zorientowana na wątki i przechowuje/pobiera sesję nHibernate na wątek. Jest on teraz pracuje ładnie;)

Odpowiedz

17

Sesje są nie wątku bezpieczne w NHibernate projektem. Powinno być OK, o ile sesja jest używana tylko przez jeden wątek:.

Nie jestem pewien, co masz thingResolver robi, ale jeśli to robi kilka telefonów oporność na ten sam sesji utworzoną w wątku pochodzące - to najprawdopodobniej przyczyną problemów, można utworzyć oddzielną sesję w nowym wątku, aby była to sesja na wątek, jeśli moje założenie jest prawdziwe.

NHibernate odniesienie ma go w punkcie 10.2

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

+0

dzięki Aleksey. Będę miał problemy, aby to zrobić (praca z inną sesją), ponieważ narusza mój projekt, myślę o zapomnieniu o tym wielowątkowym. –

+0

w rzeczywistości moja fabryka sesji jest solidna i może przechowywać sesję w wątku, jej działanie: D –

+1

Zaktualizowany link do dokumentacji http://nhforge.org/doc/nh/en/index.html#transactions – AlfeG