2012-08-02 54 views
1

可以啓用一個緩存,該緩存在請求開始時開始並在請求結束時結束?每個請求緩存的ASP.NET nHibernate

對於某些表,啓用一次不會選擇相同記錄的緩存很有用。

例如,當我多次渲染一個partial時,partial中的SELECT是不必要的。

假設這個片段:

@foreach(var row in orders) 
    { 
     @{Html.RenderPartial("Order");} 
    } 

和部分的順序是:

<div> 
     @session.Query<Langs>.SingleOrDefault(el => el.Id == "EN').Description 
    </div> 
<div> 
    @Model.OrderID 
</div> 

有可能啓用緩存「LANGS」表只在當前會話中的緩存?

沒有緩存我有N(訂單計數)SELECT每個請求,否則與請求緩存我將有每個請求1選擇。

謝謝!

回答

2

您不應該在任何視圖中執行任何數據庫查詢,例如您提到的部分。這幾乎總是會導致SELECT N + 1場景。

遵循MVC模式,不要混淆關注點。任何數據庫查詢都應從存儲庫層啓動,然後填充表示視圖所需數據的模型對象,然後將該模型傳遞給視圖。

通過編程,任何事情都是可能的,並且總有一百萬種方法可以做同樣的事情,但遵循最佳實踐和關注點分離可以幫助您從自己身上獲益並幫助您構建高效,可擴展和可維護的應用程序。

重申,無論您的視圖需要訪問哪些數據,都要在MVC模式的Controller側進行所有查詢。以任何其他方式進行這種做法都會混淆顧慮,並導致遇到的情況(如您遇到的情況)。

1

你至少有2個posiblities:

  • 緩存查詢
  • 啓用對象緩存LANGS映射

查詢:

@session.Query<Langs>.SetCacheable(true).SingleOrDefault(el => el.Id == "EN').Description 

並添加鍵休眠.cache.use_query_cache =對配置爲true

+0

但是... nHibernate 2°高速緩存是應用程序/會話高速緩存還是請求高速緩存? – 2012-08-02 13:28:28