我正在開發和作爲Windows服務運行的應用程序。還有其他的組件,其中包括幾個WCF服務,一個客戶端GUI等 - 但它是訪問數據庫的Windows服務。Windows服務應用程序中的NHibernate會話管理
因此,該應用程序是一個長期運行的服務器,我想提高其性能和可伸縮性,我期待着改善數據訪問等。我發佈了另一個關於二級緩存的主題。
這篇文章是關於訪問數據庫的長時間運行的線程的會話管理。 我應該使用線程靜態上下文嗎? 如果是這樣,是否有任何如何實施的例子。每個使用NHibernate的網絡用戶似乎都非常關注Web應用程序樣式體系結構。非網頁應用程序設計似乎缺乏文檔/討論。
此刻,我的長期運行的線程做這樣的:
- 呼叫3種或4 DAO方法
- 驗證分離對象的狀態恢復。
- 如果需要更新狀態。
- 調用幾個DAO方法來保存更新的實例。 (傳入對象的id和實例本身--DAO將再次從DB檢索對象,並在提交事務之前設置更新值和session.SaveOrUpdate()。
- 睡眠時間爲'n'秒 !
- 重複一遍
因此,以下是我們使用的每一個DAO方法的通用模式:
-
使用sessionFactory.OpenSession
- 打開的會話()
- 開始交易
- 做db工作。檢索/更新等
- 提交反式
- (回滾在例外的情況下)
- 最後總是處置交易和session.Close()
出現這種情況每方法調用一個DAO類。 我懷疑這是某種反模式,我們正在這樣做。
但是,我無法找到足夠的方向,以至於我們無法改進它。
請注意,雖然此線程在後臺運行,但在執行其任務時,有來自WCF客戶端的請求,每個客戶端都可以自行進行2-3個DAO調用 - 有時查詢/更新相同的對象正在運行的線程處理。
任何想法/建議/指針,以改善我們的設計將不勝感激。 如果我們能得到一些很好的討論繼續下去,我們能做出這樣一個社區維基,並possbily從http://nhibernate.info
這裏鏈接到克里希納
+1。我幾次看到這個一般性建議:SessionFactory是昂貴的。只創建一次。會議很便宜。 – snicker 2010-03-11 21:59:09