2011-12-01 65 views
0

我想知道是否應該以某種方式緩存從我的DAL返回的對象?我可能有多個UI控件在頁面的單個負載中調用相同的數據。緩存DAL返回對象?

你們會推薦什麼?我開始謹慎一點嗎?它不是一個可怕的數據量。但是,如果我應該以某種方式進行緩存,那麼推薦的方法是什麼?

+0

如果你有性能問題,而不是因爲有人這樣說,你需要緩存... –

+1

@DanielHilgarth我不同意。您可以留意未來,而不是不必要地做20個電話來獲取用戶ID。他也可能超載數據庫而不知道它,但是沒有性能問題。 –

+0

那麼我一直在遇到一些奇怪的性能問題,但我還不確定這是由於對數據庫的多次調用。調試抓取數據時需要幾毫秒。但它在名單上正在消除。然而,正如你所說的尤里,在對數據庫的呼叫方面規劃未來並沒有什麼壞處。 – Nugs

回答

1

你可能cache如果你真的在同一頁面上有多個控件使用相同的數據,你可以在父頁面調用一次數據,並在每個控件中使用Setter將引用傳遞給每個控件(而不是讓每個控制器從DAL本身拉出相同的數據),例如:

myControl.AllUsers = _allUsers; 
.... 
myOtherControl.AllUsers = _allUsers; 

我也同意@DanielHilgarth。緩存增加了複雜性(例如,何時刷新緩存)。無論如何,如果頁面加載速度很快,我不會打擾。

如果頁面很慢,循環中的數據庫調用通常是我的經驗的罪魁禍首。

+0

感謝這是我要採取的方法,它似乎工作得很好。我打算從父頁面調用一次數據(並在稍後需要時將其緩存在父頁面上),並將填充的對象傳遞給所有控件,而不是讓控件獨立調用它們。我認爲這將大大優化頁面,並讓我避免在DAL內緩存一些複雜性。 – Nugs

0

這取決於它是否安全並且必要時這樣做。如果您正在使用的數據不需要實時數據(即您的博客),那麼如果您覺得這樣做是必要的(意思是您的網站運行緩慢),那麼通過一切手段緩存。

高速緩存的一個問題是,如果需要立即響應(例如禁止用戶或更新支付網關信息)的事情,人們很多時候會忘記要求清除緩存。

有兩種主要類型的緩存,滑動緩存和固定時間緩存。

滑動緩存(每次執行有效檢索時得到擴展的緩存)對於計算相對容易的值但可能會受到數據庫/網絡開銷影響的資源非常適用。在滑動高速緩存上緩存1小時(或永遠),然後在DAO發生INSERT/UPDATE/DELETE時手動使緩存無效(移除)。通過這種方式,用戶將看到實時結果,但實際上只要有可能就會被緩存。

固定時間緩存適用於難以執行的資源(即非常複雜的存儲過程),並且不需要實時準確性。在首次請求時緩存1小時(或永遠),並且在第一個小時到達之前不要清除緩存。 INSERT/UPDATE/DELETE被你的緩存機制忽略(除非它是絕對必要的)。

+0

謝謝馬修。這實際上可能是一個5秒的緩存。這是我正在使用的實時數據,但我最擔心的是一次調用數據的單個頁面可能需要10次。如果我可以將第一個響應緩存幾秒鐘,那麼所有後續對同一頁面數據的後續調用將更快,並且數據庫將只需處理1個數據調用。 – Nugs

+0

它是一個單一的頁面〜請求〜?如果是這樣,只需將其保存在本地變量中,並在數據應該保持不變的情況下重用該變量。無論如何,如果你仍然想實現某種緩存,那麼滑動緩存機制對此最好。 – Matthew

0

要做到這一點,你可以看看這個庫:

http://www.reactiveui.net/

它提供了一個整潔的乾淨的方式來緩存你的對象。

我會說這是一個非常整潔的方式。