2008-10-28 94 views
12

我有一個使用nHibernate會話的很多持久性調用的方法,它的工作,沒問題。但是我需要重構這個方法,從一個循環內的一個內容中提取一個方法,用於多線程的原因。然後我用這種方法創建了一個類。它就像一個正常的重構,但是這個方法調用中的nHibernate會話被破壞,沒有上下文,我沒有在任何時候敲定它。 nHibernate有多線​​程問題嗎?即使我只有一個線程執行,我也有同樣的問題。nHibernate會話和多線程

我通過SessionFactory和Façade模式使用nHibernate Session,它表示會話不是這些對象的字段,它在SessionFactory中是全局的。


使其成爲一點點清晰:

BEFORE:

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

AFTER:

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 
} 

我們的nHibernate會話工廠是線程感知的,併爲每個線程存儲/檢索nHibernate會話。它現在工作很好;)

回答

17

會話是非線程安全在NHibernate 由設計。 所以它應該可以,只要你有一個會話只使用一個線程

我不知道你在做什麼呢thingResolver,但如果它確實在一些持久性的呼叫您在起始線程創建的相同會議 - 這很可能是你的問題的原因,您可以創建一個單獨的會話在你的新線程中,這樣如果我的假設是真的話,它將成爲每個線程的會話。

NHibernate的參考有它在第10.2

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

+0

謝謝阿列克謝。我會遇到問題(與另一個會話一起工作),因爲它違反了我的設計,所以我正在考慮修改這個多線程的東西。 – 2008-10-28 12:03:37