2010-12-03 29 views
3

嘗試將NHibernate遷移到現有的C#WinForms應用程序中,並且我正在尋找管理會話的最佳方法。我只是在學習NHibernate,所以請原諒我的知識缺乏,有人可以給我提供我們可以使用的任何會話管理代碼,我們發現的大部分實現都是針對網絡應用的。NHibernate - Session Singleton C#

任何幫助表示讚賞。

回答

1

桌面應用的最好的文章假設你已經熟悉XML和NHibernate的配置本身,還有就是你需要做一個單身,也就是ISessionFactory API一個對象。爲什麼這應該成爲一個singleton的原因是,關於連接的完整配置以及所有的實體映射都被加載到內存中,以便NHibernate知道如何以及在哪裏堅持到底層數據存儲中。因此,ISessionFactory API實例化成本非常高。

至於會話,有兩個方面需要考慮,無論你想要一個無狀態還是一個有狀態的會話。這個選擇完全是你的,但知道它的區別。

ISession API會跟蹤附加實體上的每個變更。附加實體是使用NHibernate提供的一種可能方式從底層數據存儲區加載的實體,或者是剛剛實例化並且已將自己附加到會話的臨時實體。爲toolong保留這樣一個有狀態的會話可能會導致數據丟失,這將在該API泄漏到內存中時發生。一旦發生泄漏,整個變更軌道都會被丟棄,並且會話不能再使用。 ISession API應始終與ITransaction API一起使用。 ITransaction可能與直接在SQL中使用Begin Transaction相同(TSQL,PL/SQL和其他)。每次您需要堅持進入數據庫時​​,您都應該在使用交易時這樣做,以防止錯誤排除變更或無論如何。 ISession API應該在工作單元的開始處實例化。一次只能使用一個ISession API實例來處理多個表單。也就是說,將ISession API實例設置爲單例是一個非常糟糕的主意,因爲內存管理原因,ISession會跟蹤發生在附屬實體上的所有更改。保持ISession API活動時間過長會導致它使用越來越多的內存,這會導致內存泄漏和會話垃圾。

IStatelessSession API做它所說的。它是無狀態的,它不會跟蹤對附加對象所做的任何更改。因此,您將不得不手動知道要針對您打算堅持的實體的數據庫執行哪些操作,比方說。 IStatelessSession也使用ITransaction API來處理數據完整性。在連接到數據存儲區時,這兩者應始終相互配合使用。 IStatelessSession通常在創建時根據需要使用,因爲它除了與數據存儲「交談」以外沒有其他用處。我相信,這個API主要用於無狀態規則最多的Web應用程序。

一旦您選擇了最符合ISessionIStatelessSesion API之間的要求,即可開始使用。