2015-12-12 56 views
1

我正在尋找有關如何在羣集中運行時最佳配置卡宴或使用相同域的多個JVM的資源。我一直在閱讀文檔,我看到:Cayenne Cache - 查詢緩存是否替換對象緩存?

「有辦法通知其他堆棧有關對象更改,可以在Modeler中設置,但每次更改的完全同步通常會導致網絡通信量過大和CPU消耗,通常可以避免使用本章其他地方描述的查詢緩存方法。「

鏈接到查詢結果緩存頁面。我的理解是,當通過getter獲取關聯對象或者通過id獲取對象時使用對象緩存。這句話告訴我,如果我配置查詢緩存,將不會使用對象緩存?或者我需要避免這樣做會在我的應用程序代碼中擊中對象緩存?我應該完全禁用對象緩存嗎(如果甚至可能的話)?如果我沒有設置cayenne來通知對象緩存的其他堆棧更改,請不要冒過時的數據風險嗎?

我感謝任何和所有關於在多個節點上運行卡宴的最佳方式的提示,或者如果您有一些資源指向我,那也會非常有幫助。

在此先感謝您的時間!

回答

1

對象緩存和查詢緩存是相互獨立的,儘管它們可以影響彼此的狀態。擴大對象圖時(如您正確注意到)

對象緩存

對象緩存被訪問。但對象緩存的同步不只是更新緩存,而且還傳播到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並整合外部緩存提供程序。

+0

這是很棒的信息。謝謝。我會考慮升級。我繼承了這個項目,原來的作者實際上分叉了3.0.5並做了一些修改,我將不得不深入研究,看看究竟發生了什麼變化以及爲什麼(我相信它很小)。一個小問題:要禁用對象現金,我是否將其大小設置爲零,或者我應該採取其他步驟? – eric

+0

我只是單獨留下對象緩存(它仍然很有用,並且由於查詢緩存更新而被動更新)。只是不要試圖將其集羣,並關閉其本地同步設施。我會用這個信息在一秒鐘內更新主要答覆 –