2011-10-12 122 views
0

我正在編寫一個應用程序,並最終將它保存到數據庫中。但是,如果有人能幫助我指出正確的方向,我會遇到一些問題,並且正在徘徊。NHibernate會話通過多線程訪問

在我的應用程序加載過程中,我啓動了一個NHibernate初始化線程,該初始化線程初始化NHibernate,然後觸發3個獨立的線程來加載3個對象,以便分離和優化加載時間。

我最初在這些線程的每一箇中創建一個臨時會話,以便從數據庫中查詢對象;然而,我遇到了訪問我的對象的一個​​集合的問題,說一個會話沒有打開或者它已經關閉。我有一個靜態會話,可以在整個Windows應用程序中全局訪問,當它爲集合調用GetEnumerator時,此會話的狀態仍處於打開狀態。

我相信它與在初始化過程中線程的不同會話中加載的Intersection相關的事實有關。從同一會話中加載所有對象都可以正常工作;然而,我會偶爾遇到異常,並以非線程安全方式使用會話時發生錯誤。

我的問題是這樣的。有沒有辦法將會話「合併」到我的全局會話中?我能做些什麼來設置Intersection類到它有一個打開的會話爲了加載集合?是否需要在主線程中打開靜態全局程序會話的會話?或者我將無法將我的init進程中3個不同類的加載線程分成3個獨立的線程?

+0

我最後一次檢查,NHibernate的會議分別不是線程安全的。 –

+0

是的,我知道這一點。有什麼辦法可以將會話與另一個會話合併,所以線程A知道從線程B加載到會話中的對象?否則,有沒有辦法解決我的收藏訪問在一個對象? –

+0

您可以將從一個會話加載的對象「合併」到另一個會話中。我不太確定整個會議。 –

回答

2

您可以將加載其他會話的對象圖與您的主會話相關聯。

  • 如果對象可能已經改變,那麼MainSession.Merge(obj),因爲它會載入DB-國家知道發生了什麼變化。

  • 如果對象沒有改變,那麼MainSession.Lock(obj, LockMode.None)就足以將它與主會話相關聯。

之後,你就可以使用的對象,好像他們是載有您的主會議