好吧,我有一個非常複雜的Silverlight應用程序,它從一個WCF服務(asp.net託管的服務層)獲取其數據,該服務又調用一個調用存儲過程的數據層SQL 2005 DB來提取所需的數據。所以往返是這樣的:WCF/Silverlight/SQL數據庫緩存策略
Silverlight應用程序 - > WCF服務 - >數據層 - >數據庫 - >數據層 - > WCF服務將數據實體轉換爲相應的DTO(數據傳輸對象)或List <> - > Silverlight App
大部分數據都是高度關聯的(所以它需要存在於數據庫中),但它很少會改變。看起來我有幾個位置選擇來緩存這個「半常數」數據:
- 我可以將其緩存在數據層中。我的數據層已經設置爲使用SQLDependency類並緩存存儲過程調用的結果。我認爲這是或者可以是應用程序級緩存。
- 我可以緩存在WCF服務本身的應用程序級別(或會話級別取決於調用)緩存結果的DTO。 (a)我甚至可以進一步通過將得到的DTO的XML序列化爲WCF服務端的文件,以便我可以(a)檢查內存緩存,然後(b)檢查文件緩存和(c)擊中數據層
- 我可以在SL應用程序的客戶端使用隔離存儲來做類似於2(a)的操作。我可以使用散列(或者moddate或者其他)將數據序列化到本地隔離存儲,然後只需撥打一個電話即可檢查該數據。
還有一件事需要補充:我在IIS7中託管了這個WCF服務,並開啓了動態壓縮功能,以便(通常非常大且容易壓縮的)XML響應得到gzip-ed。理想情況下,我想IIS會緩存這個gzip-ed結果以避免所有額外的處理。我認爲它可能已經這樣做了,但我不確定。
我很確定最終答案是「它取決於」的某種味道,但我很想聽聽別人如何接近這個。 Do X的一個好的戰術方法,用工具Y測試性能,如果需要的話,做Z會很好。
幾個環節(我會添加到這個,因爲我研究這個):