2010-01-02 76 views
1

說我有對象A,其具有類型對象B的成員,..和對象B具有Object類型的構件C..NET序列化和高速緩存問題

對象A很少變化,但被讀取很頻繁,而對象C經常這樣做。緩存對象A是有意義的,但是當它被序列化進入緩存時,顯然會將整個圖表序列化。

情景: 對象A從數據庫和填充閱讀。對象C的變量被訪問並延遲加載。爲了舉例,C.Status在業務邏輯中被引用,並且具有值ACTIVE。我將A.Name更改爲「New Name」,並提交給數據庫和緩存。

對象C(從代碼別的地方)有它的狀態改爲掛起。

  • 此時我應該使對象A的緩存無效? *

如果我做的:

如果(A.B.C.Status == ACTIVE) SendLotsOfMoney(A)

這會通過,因爲整個圖形序列化。

如果C.Status勤換我不想保持的高速緩存失效,因爲我可能會經常提到A.Name,A.Status等,並且不希望保留命中數據庫。

我想我的選擇是: 1)在對象中有一個標誌,它來自緩存,並強制重新載入所有的依賴關係,如果它已經被引用並且它們被引用(延遲重載它們) 。無論如何,這些可能來自緩存......但是當時我的緩存中仍然有很多毫無意義的存儲數據。

2)保持無效緩存。很明顯,如果我有A.B.C.D.E.F.G.Status和A.H.I.J.K.Status等,那麼我會一直在重新創建A?

3)我重寫OnDeserialization和做的是在(1)

4)我重寫OnSerialization並設置所有引用爲空(所以他們延遲加載,而不是存儲在哪裏?)

我m有興趣聽到答覆。我傾向於4

問候!

+1

你不應該違反德米特法! – jason 2010-01-02 13:22:34

+0

這可能是真的,但我繼承了另一個系統,並且存在與往返於DB的性能問題 – sjhuk 2010-01-02 13:45:44

回答

1

你有辦法在A·B改變參考C到零C鈕時?然後,而不是使所有A無效,只需將C引用設置爲null並在您需要時再次加載它即可。

或者,你可以從A和B分別緩存C.在A·B,而不是到C的引用,你可以保持一個高速緩存鍵。然後,你可以在你需要無效C,並使用緩存鍵來檢索和/或延遲加載它,

0

我在想,當我添加項目到緩存我要舉報的數據對象「BeenCached」,然後當對象需要再次加載各種屬性時,它會檢查緩存標誌,首先檢查它是單獨的ReloadedFromCache標誌並填充它(可能從緩存或數據庫重新填充)。

它應該工作正常。因爲對象在其他地方被序列化/反序列化,所以我不會去掉序列化/反序列化路線。