對象緩存和查詢緩存是相互獨立的,儘管它們可以影響彼此的狀態。擴大對象圖時(如您正確注意到)
對象緩存
對象緩存被訪問。但對象緩存的同步不只是更新緩存,而且還傳播到ObjectContexts,導致內存中對象圖的刷新。雖然這聽起來很棒,而且超級自動,但從經驗來看,它在桌面應用程序中最爲有用,因爲您可以獲得與單個用戶相關的有限對象圖。在羣集多用戶Web應用程序中,同步對象緩存更麻煩,然後幫助。它會創建大量網絡流量,強制您的實例使用CPU來處理它們並不關心的事件,最後,在您最不期待的時候從底層更新對象。所以我通常關閉對象緩存同步功能,並完全依靠羣集查詢緩存來處理同步。
查詢緩存
這裏是an example project與集羣示範查詢緩存。它使用Cayenne 4.0,EHCache作爲緩存提供程序,以及用於跨實例事件的ActiveMQ/JMS。
查詢緩存的工作方式是緩存與給定查詢匹配的對象列表,包括預取的相關對象(如果查詢包含預取)。要充分利用查詢緩存,您可能需要稍微改變一下編碼風格。您不必在實例變量中存儲對查詢結果列表的長時間引用(本質上是做自己的緩存),只要您需要這樣的列表,就可以創建並運行查詢(使用正確的緩存設置),並讓Cayenne決定列表是否應該從緩存中返回或從數據庫中新取。
下一步是以某種方式配置緩存,具體取決於您使用哪種提供程序來指定其默認到期策略(按緩存組)。例如。一個sample EHCache config。
最後,您可以添加集羣和事件驅動的緩存刷新,可以通過API調用顯式地完成,也可以隱式地提交某些實體(僅在Cayenne 3.1以後纔可用)。
查詢緩存刷新非常便宜。通過網絡發送的唯一信息是「緩存組」的名稱,而在接收端,一堆列表一下子就被無效化了。它還會產生更清晰的代碼。
如果您主要依賴查詢緩存,則不需要「關閉」對象緩存本身。對象緩存是Cayenne不可或缺的組成部分,並且需要進行一些操作(更新,關係處理)。它將在您運行查詢時自動更新。你通常需要做的是關閉自動對象刷新。通過不啓用對象緩存集羣,您已經避免了跨JVM同步。另外,您可以使用this advice禁用同一VM內的跨ObjectContext同步。卡宴
的
版本我強烈建議升級到至少3.1卡宴(甚至4.0.M2)。除此之外,緩存機制比3.0更成熟。它將使您的配置體驗更加容易,配置Cayenne並整合外部緩存提供程序。
這是很棒的信息。謝謝。我會考慮升級。我繼承了這個項目,原來的作者實際上分叉了3.0.5並做了一些修改,我將不得不深入研究,看看究竟發生了什麼變化以及爲什麼(我相信它很小)。一個小問題:要禁用對象現金,我是否將其大小設置爲零,或者我應該採取其他步驟? – eric
我只是單獨留下對象緩存(它仍然很有用,並且由於查詢緩存更新而被動更新)。只是不要試圖將其集羣,並關閉其本地同步設施。我會用這個信息在一秒鐘內更新主要答覆 –