0

在應用程序中我有一個名爲循環的參考表映射到循環實體。基本上NHibernate實體映射的大部分都保持對該表的引用。通常,這些實體有這樣的字段:NHibernate的緩存選項

  • StartCycle
  • ModificationCycle
  • EndCycle
  • 週期

即使我用每個請求會話我仍然看到在日誌大部分查詢發佈到週期表。當我不是通過循環ID查詢,而是通過屬於循環類型的其他屬性時,就是這種情況。

週期類型幾乎是一成不變的,它有狀態屬性,其實這是一個可以由服務類被改變(如CloseCycleService,開放等)的唯一屬性。 另外Cycle不能被刪除,但可以插入。

所以我想盡量減少查詢次數到週期表。

我可以通過使用應用程序緩存將其緩存在ASP .NET中,並創建另一個抽象層,但在此之前,我想知道NHibernate提供了哪些選項以及哪些是缺點?

我看到的唯一問題是多線程 - 即使週期幾乎是不可變的(和無狀態的),它可能發生兩個請求試圖同時修改同一個實體並可能導致錯誤。但是......這幾乎是不可能的。所以,你可以建議我可以用NHibernate做什麼來將Cycles表的所有內容存儲在緩存中(哦,我也沒有提到該表中的數據數量很小:每個月有一個週期,所以目前它大約20行,並且每月增長1行)並且最小化發佈到週期表的查詢?

回答

2

對SysCacheProvider和查詢緩存使用NHibernate二級緩存 - 當您爲Cycle實體創建一個查詢時,調用.SetCacheable(true)將查詢結果存儲在緩存中(以及實體本身)

NHibernate的二級緩存實現得非常好,並將保持緩存與您在同一進程中所做的任何更改保持一致。如果您直接在數據庫中進行更改,那麼您可以查看我相信也支持SqlDependencies的SysCacheProvider2(我認爲)。