2017-09-02 121 views
0

我正在使用Ehcache在Web應用程序中緩存昂貴服務調用的結果。Java Web應用程序中的持久緩存?

我希望緩存在JVM重啓過程中持續存在。

我用heapdisk配置了一個雙層ehcache。不幸的是Ehcache只在調用PersistentCacheManager.close()時纔將緩存保存到磁盤。

如何才能讓持久性正常工作?我應該定期關閉並重新打開緩存?我應該看看ehcache以外的東西嗎?

+0

製作可從光盤存儲加載的緩存實際上非常困難。可能* Ehcache *決定將其緩存存儲在內存中足夠好。我想你可能需要多看看,找出你需要的東西。尋找由數據庫支持而不是平面文件的東西,因爲如果要保存對象並實時檢索它們,基本上就是您需要的。 (平面文件僅用於啓動/關閉保存。) – markspace

+0

您的應用程序聽起來像與SQLite3的完美匹配。 – MarsAtomic

回答

0

Ehcache使用分層模型 - 寫入緩存的數據總是放在最低層 - 磁盤上。然後在發生讀取操作時,將頻繁訪問的值拉入堆層以便更快地檢索。因此,數據將在操作期間寫入磁盤,提供比堆更大的緩存空間。

爲了保證高速緩存的完整性和JVM重啓後恢復數據的能力,需要調用PersistentCacheManager.close()。但這並不意味着它必須在應用程序的生命中發生,只需要一個正確的Web應用程序關閉序列而不是簡單地殺死JVM。

0

我建議你使用Terracotta cluster deployment(它也是開源的),在你的web應用程序JVM旁邊。

你會再配置,對Web應用程序,3層:堆,offheap和集羣

<cache alias="clustered-cache"> 
    <resources> 
    <heap unit="MB">10</heap> 
    <offheap unit="MB">512</offheap> 
    <clustered-dedicated unit="GB">2</clustered-dedicated> 
    </resources> 
</cache> 

Terracotta服務器部署將是1活動,1被動 - 所以,當你有一個故障或在1臺服務器上進行預測性維護,另一臺仍然服務於所有客戶端。

與開源磁盤層相比,使用開源羣集層的好處在於,如果發生故障(Web應用程序容器故障,兵馬俑服務器故障),您的數據仍然完好無損,這要歸功於您的冗餘建立。