簡體   English   中英

NHibernate和潛在的緩存問題

[英]NHibernate and potential caching problems

好的,所以我有一個n層模型。 (WPF,Asp.Net等)通過WCF進行后端服務。 這些服務使用NHibernate與數據庫進行通信。 其中一些服務將在InstanceContextMode.Single模式下運行。

問題:

  1. 在單例服務實例中,我應該在wcf服務處於活動狀態的整個過程中嘗試利用1個會話對象來最大程度地利用我的緩存嗎?
  2. 如果我在此單例實例中使用1個會話實例,並且從不創建新實例,那么我認為我不得不擔心最終從會話中刪除緩存的實體或將其全部轉儲以避免會話性能問題?
  3. 以這種方式將會話用於單例wcf服務是個好主意嗎? 如果我想利用緩存,就好像是這樣。
  4. 我應該在這種情況下利用二級緩存嗎?
  5. 在這種情況之外,什么時候應該避免緩存? 我假設我想在任何創建/更新大量對象並且在創建或更新之外再也沒有真正使用過的對象的批處理場景中避免使用它。
  6. 創建/讀取/更新/刪除項目時,項目是否會自動緩存在會話中,還是需要在映射文件或配置中指定某些內容?

1-3:據我所知,ISession對象應該是重量輕,壽命短的對象,它們僅在需要它們的持續時間內存在。 我建議AGAINST在您的服務的整個生命周期中都使用相同的ISession對象。
我建議使用的是相同的ISeessionFactory實例,並根據需要從中創建新的ISession(您可以嘗試使用類似於Session-Per-Request模式的方法)。
如果啟用第二級緩存,則在這種情況下可以享受緩存的所有好處。

5是的,差不多。 還要記住,第二級緩存實例是每個ISessionFactory實例 這意味着,如果您使用多個ISessionFactory實例,則您的緩存會遇到很多問題。

對於1級緩存,您不需要定義6。
對於二級緩存,您需要在配置nHibernate時啟用緩存(以我為例):

.Cache(c => c.UseQueryCache()
                                    .ProviderClass(
                                    isWeb ? typeof(NHibernate.Caches.SysCache2.SysCacheProvider).AssemblyQualifiedName //in web environment- use sysCache2
                                        : typeof(NHibernate.Cache.HashtableCacheProvider).AssemblyQualifiedName //in dev environmet- use stupid cache
                                    )) 
                          )

並為您要為其啟用緩存的每個實體和每個集合指定:

mapping.Cache.ReadWrite().Region("myRegion");

並進行收集:

mapping.HasMany(x => x.Something)
.Cache.ReadWrite().Region("myRegion");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM