2012-08-05 131 views
2

我有一個遺留網站,需要一點優化,因爲性能差。它是一個asp.net購物網站,其中linq以sql作爲數據層,MVP模式作爲UI模式。緩存數據,直到更改

db中最昂貴的實體是具有一對多關係的產品和類別表。除非管理員組的用戶決定添加產品或類別等,否則這兩個實體可能不會定期更改。我想知道爲每個請求創建和從這兩個實體獲取所有內容的資源成本高昂是多少!所以如果我可以有一種方法來保持我的數據活着...

首先,我認爲好吧讓我們使用AJAX進行數據檢索,所以我將只創建那些我需要查詢或綁定的實體,但是請等待,我該如何才能這樣做,而不創建一個新的DataContext實例? 另一方面,由於內存成本的原因,對整個DataContext使用緩存被認爲是一個糟糕的決定。那麼這裏最好的選擇是什麼?我該如何改進?

UPDATE

1)做什麼@HatSoft建議。

缺點:那些方法不會幫助你的代碼,只有數據庫。除此之外,可能會有內存問題,因爲我們將數據放入內存而不是呈現html,但這可能是關於解耦的最佳選擇。

2)使用輸出緩存,我們在與*的.aspx通配符的HTTP處理程序的代碼:

string pagePath = Context.Request.Url.AbsolutePath; 
object cacheKey = application[pagePath]; 
if(cacheKey == null) 
    return; //application restarted/first run so cache the stuff 
else 
    Context.Response.RemoveOutputCacheItem(pagePath); 

缺點:現在我們應該鏈接的PAGEPATH到該頁面使用的每個數據庫實體,但如果我這樣做,那麼我將它們聯繫起來而不是將它們分開。這種方法也會遇到一些硬編碼。

3)另一種解決方案是輸出緩存後緩存模式,而不是控制緩存模式。使用Subsituation元素並將OutPutCache Duration設置爲86400,以便每24小時重新創建頁面。

缺點:硬編碼用戶控件爲動態生成Subsituation元素的html輸出。

那麼你有什麼建議?

回答

1

我建議你在看的SqlDependency類,請閱讀這篇文章http://www.asp.net/web-forms/tutorials/data-access/caching-data/using-sql-cache-dependencies-cs

此外,我建議你在應用程序啓動時查找到加載數據在緩存中,如果它適合你的應用程序。請看這裏的一個很好的例子http://www.asp.net/web-forms/tutorials/data-access/caching-data/caching-data-at-application-startup-cs

+0

檢查我的更新。 – jim 2012-08-06 13:37:00

0

使用Linq2SQL,你可以使用LinqToCache,它爲你的LINQ查詢提供了一個供電高速緩存的SqlDependency。它將IQueryable<Products>轉換爲IEnumerable<Products>,並在首次訪問(底層IQueryable的第一次迭代)後枚舉形式存儲器。根據SqlDependency數據更改通知,它將使列表無效,隨後的訪問將再次從數據庫中查詢並緩存結果。

我的建議是將產品列表和類別緩存在內存中,因爲它們很少發生變化,我希望它們的尺寸相當有限。

+0

每次從內存緩存中返回列表時,都會保存數據庫命中。 – 2012-08-06 15:36:43

+0

1)在許多HTML輸出中可以使用相同的數據(例如,緩存類別列表,它用於任何*頁面響應)。 2)數據具有明確的到期語義(SqlDependency將使類別表的任何後端更新上的緩存無效)。 3)你仍然可以緩存生成的HTML,以保存處理。 – 2012-08-06 15:47:16

+0

*每個* cache必須至少使用*一次*,否則不是緩存。沒有人提到'SqlCacheDependency',我說'SqlDependency'。閱讀http://rusanu.com/2006/06/17/the-mysterious-notification/ – 2012-08-06 17:39:25