2012-11-15 165 views
4

我正在尋找Java Web應用程序的緩存解決方案。我們有一個Oracle數據庫實例和2-3個遠離我們數據庫的實例。 我們希望將數據本地緩存到我們的應用程序,因爲我們無法接受數據庫響應時間。 我們的數據集的平均大小(每個表格有幾千行),並且從我們的應用程序(無直接db訪問)手動修改(所以不是很經常)。需要Java緩存解決方案

所以我們一直在想的是一個解決方案,它允許我們獲得所有本地需要的數據。我們希望減少從數據庫中檢索的數據量並重寫到緩存。例如,當一個實體被修改時,我們不希望使該表上的所有緩存查詢無效,我們寧願希望能夠修改本地緩存查詢結果集,因此查詢仍然可以從本地運行緩存的數據。 緩存必須複製其更改\從數據庫中檢索由其他應用程序實例修改的數據。

我們一直在尋找EhCache作爲Hibernate二級緩存,但它會使任何表修改上給定表的所有緩存查詢無效。我快速瀏覽了Hibernate Services,但不知道它是否允許我們重寫hibernate的二級緩存默認行爲以滿足我們的需求。

我們可以使用其他解決方案嗎?

編輯我們想要非常快速地訪問數據。有效地,我們正在尋找的是一個可以緩存的緩存。

+3

爲什麼不創建一個本地數據庫並將其複製到遠程?它將避免除連接字符串之外的任何代碼更改,提供更高的速度並確保與遠程數據庫的數據一致性。 –

+0

您是否爲每個應用程序實例建議一個數據庫實例?對我來說似乎是一個很大的設置開銷。 –

+0

否 - 在本地服務器/虛擬機上運行數據庫的完整副本,然後將其複製到遠程 - 以主/從關係。 –

回答

3

你檢出了JBoss緩存嗎?您可以分別爲查詢定義逐出策略,並且可以非常容易地在羣集節點之間同步。如果你需要的話,你可以閱讀關於我編譯的文章的文章,如果它對你有幫助的話;

http://dinukaroshan.blogspot.com/2009/10/jboss-caching-integration.html

+0

可以使用JBoss更改默認的hibernate第二級緩存行爲,在每次修改完成時都會使表上的所有緩存查詢無效?由於查詢緩存僅對靜態數據有意義,所以標準hibernate二級緩存不符合我們的需求。 – Bart

+0

嗨巴特,通常的經驗法則是緩存很少更改,但經常閱讀(例如主數據)的數據..我不知道如果您可以更改無效規則..但會檢查並取回給您.. – dinukadev

2

如果你使用了Ehcache和你在集羣多個應用程序,你將不得不使用一種機制(JMS,JGroups的,...)的數據高速緩存複製。

您必須注意的一件事是,如果您有另一個應用程序未在Java中運行,則不會通知該應用程序:JGroups僅在Java中可用,並且您的非Java應用程序將無法使緩存的實體。 EhCache/Jgroups支持允許您在一個配置文件中設置複製(不需要額外的代碼!)

看來您正在尋找EhCache的「通過複製更新」功能。讓我列舉一個的Ehcache的配置的可能性:通過複製

更新VS失效

更新通過複製:數據發送到所有節點
優點:避免緩存
的完全重新加載 缺點:節點之間的非相干數據是可能&無用的,如果所述高速緩存的數據的TTL是低

經由無效更新:通知的無效發送到所有節點。如果數據已被緩存,則節點會再次刪除緩存的數據以查詢數據庫。
優點:數據一致性&網絡流量打火機
缺點:數據庫查詢的地段,它可能會導致數據的大量需求同時


異步VS同步

異步
優點:快速回復&和數據傳輸
缺點:UDP ...

同步
優點:數據完整性
缺點:香水,衛生


我希望它幫你選擇了正確的決定。

0

緩存查詢結果的失效並不是緩存控制的事情,而是Hibernate如何處理他的QueryCache ......我沒有看到如何改變這個代碼。另外,我不認爲坦白地說,這個問題有更好的「適合所有」的解決方案。

所以,如果你想非常專門緩存查詢結果,我想你必須自己實現。

另外,如果你需要更高的一致性保證,你可能會想使用集羣緩存,而不是複製一個......