2009-06-23 146 views
17

我有一段時間試圖找出我在NHibernate中的會話管理困境。我假設很多我的麻煩是由於缺乏對IoC和AOP概念的知識;至少這就是我在法比奧毛羅一直指導着我的思想。NHibernate會話管理和延遲加載

無論如何,我的問題是,我有一個勝利形式的應用程序,正在進行「獲取」調用並將結果綁定到網格。在綁定之後,用戶可以執行某種「寫入」操作,並且這些操作會導致會話在寫入後關閉,試圖使用會話每次使用概念。然後用戶可以滾動網格,導致延遲加載啓動,現在會話已關閉,我得到一個異常。

我不想讓我的觀點認識我的會話,我不想在用戶關閉表單時發送KillAllSessions。另外,用戶可能會在任何給定時間打開多個表單,從而進一步加劇與該方法相關的問題。我基本上希望所有這些在「幕後」工作。

所以我的想法到目前爲止是攔截延遲加載調用,並檢查會話是否打開,如果不重新打開它,獲取信息,然後重新關閉它。但是,據我所知,這並不多,這實際上是延遲加載的工作原理。它被代理工廠攔截(NHibernate.Bytecode.Castle),然後使用會話檢索數據。因此,我需要實際攔截該呼叫,然後在重新開放會話後將其傳遞給原來的預期攔截。所以這是我的想法。

我的問題基本上首先是這是甚至正確的方式去做這件事?第二,如果是這樣,我甚至不知道從哪裏開始。我從來沒有做過方法調用的攔截,我從理論上知道它,但在實踐中並不知情。我知道有些圖書館可以做這種事情,比如Rhino Commons,但我想借此機會學習併成爲一名更好的程序員。我正試圖理解AOP和上下文綁定對象,但目前我並不在意它。可能你們中的一些人請幫助一個人嗎?

+0

聽起來像是一件很奇怪的事情。會議結束後應處理。你能給個例子嗎? – Paco 2009-06-23 19:42:27

+0

對不起,哪一部分看起來很奇怪?就一個例子而言,除了給你提供一系列讓我面臨這個問題的事件之外,我什麼都不知道: 1.打開會話 2.以IList的形式獲取數據 3.填寫ITyped自定義集合 4.綁定到數據網格 5.任意更改 6.此更改請求會話 7.會話管理器將其交給已打開的會話 8.由於它是寫入函數,因此它在完成時關閉會話 9.用戶開始滾動網格,導致延遲加載發生 10.由於會話不再打開引發異常 – joshlrogers 2009-06-23 19:54:59

+0

爲什麼在滾動期間發生延遲加載? – Paco 2009-06-23 21:11:38

回答

7

我能想到的幾個選項:

選項1:保持原來的ISession打開,而用戶與數據進行交互,並在一旦當用戶完成提交所有更改。這意味着您可能會在內存中發生大量未提交的更改,而其他用戶將看不到未完成的更改。

選項2:將操作拆分爲兩個工作單元(UOW)。 UOW1只讀取並負責填充列表。與UOW1相關聯的ISession保持活動狀態以允許延遲加載,例如在深入情況下。 UOW2是爲用戶編輯創建的新的短期ISession。當編輯提交時,原始對象從UOW1中被驅逐,並且UOW1從數據庫中獲取新的副本。

選項3:每次提交編輯後重新創建列表。這是最簡單的解決方案,可能適用於小數據集。

2

我正在研究類似的應用程序。我正在使用一個會話,我保持開放。

每當我寫入數據庫時​​,我都會使用不關閉底層會話的begin/commit事務。數據庫連接只有在事務處理過程中由NHibernate打開。

是否有理由在用戶正在使用表單時需要關閉會話?

您能否提供更多關於您用於管理會話,存儲庫模式等的細節?