2012-10-24 198 views
0

我有一個問題,更關係到ASP.NET的工作原理,並會盡我所能解釋所以在這裏。緩存和ASP.NET

我有四個層次的體系結構,我的應用程序

  1. 網站(ASP.NET Web應用程序)
  2. 業務(類庫)
  3. 通用CRUD層**(類庫)
  4. 數據(類庫)

這是我的通用CRUD層使用反射設置和讀取對象的屬性,但我已閱讀使用PropertyInfo相當昂貴,因此想要緩存這些項目。

下面是這種情況:

兩個人訪問該網站,讓他們叫弗雷德和吉姆。 Fred創建一個Customer,然後調用Generic CRUD層並緩存System.RuntimeCache中Customer類的屬性信息。吉姆,幾秒鐘後還創建了一個客戶。

我的問題是,來自Fred和Jim的兩個請求是否會導致獲取輔助信息被觸發兩次?或者ASP.NET會第二次從緩存中檢索它,也就是說,由於屬性信息是通過緩存獲取的,所以Jim的請求更快?

我的想法是因爲我的CRUD是一個類庫並且無法訪問System.Web.Cache,所有會話/用戶都不會緩存屬性信息?

+0

「Jim的要求更快......」但如果它來自緩存,它會是正確的嗎?如果他們共享一個緩存的客戶,它會影響嗎? – spender

+6

不要僅僅因爲您已經閱讀使用PropertyInfo而花費相當大的代價就進行優化。等到你需要優化,然後使用分析找到瓶頸。過早優化幾乎總是浪費時間。另外,您擔心使用PropertyInfo的速度很慢,但是您的解決方案只是避免重複調用GetPropertyInfo(),但是每次執行更新時仍然會使用它,只需調用SetProperty()即可。 –

+0

有沒有其他方法可以使用propertyinfo?我想我將運行一些診斷程序,通過大量數據收集並分析結果。*編輯只是注意到一些名爲Reflection.Emit,任何人用這個替代?* –

回答

0

正如Alexei Levenkov指出的那樣,您必須將緩存配置爲明確發生:您不會自動緩存特定的屬性值。

但讓我指出,雖然使用PropertyInfo比直接訪問屬性編寫代碼要貴,但與數據庫往返的成本或服務器與最終用戶之間的延遲相比,它相當不起眼。像Entity Framework,WebForms和MVC這樣的工具都廣泛使用反射,因爲它所帶來的性能成本完全值得降低維護成本。

避免過早優化。

1

不,它會爲每個請求發出新的查詢(除非您另有編碼)。

在ASP.Net應用程序(瀏覽器,代理服務器端響應緩存,中間對象緩存,DA層緩存)中可能會發生多層緩存,所有這些都可以配置/使用。但是ASP.Net(或任何應用程序)中都不會緩存任何內容,除非有人專門編寫代碼/規則/配置來執行此操作。