我正在使用Ehcache
来缓存Web应用程序中昂贵的服务调用的结果。
我希望缓存在JVM重启时保持不变。
我使用heap
和disk
配置了2层ehcache。不幸的是,Ehcache仅在调用PersistentCacheManager.close()
时将缓存保存到磁盘。
如何让持久性正常工作?我应该定期关闭并重新打开缓存吗?我应该为ehcache寻找其他东西吗?
答案 0 :(得分:0)
Ehcache使用分层模型 - 写入缓存的数据始终位于最低层 - 磁盘上。然后,在读取发生时,经常访问的值被拉入堆层以便更快地检索。因此,数据将在操作期间写入磁盘,从而提供比堆更大的缓存空间。
为了保证缓存完整性以及在JVM重启后恢复数据的能力,需要调用PersistentCacheManager.close()
。但这并不意味着它必须在您的应用程序生命周期中发生,只需要一个正确的Web应用程序关闭序列而不是简单地杀死JVM。
答案 1 :(得分:0)
我建议你在你的网络应用程序JVM旁边的Terracotta cluster deployment(也是它的开源)使用。
然后,您将在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应用程序容器故障,兵马俑服务器故障),由于设置冗余,您的数据仍然完好无损