我正在使用Ehcache
在Web应用程序中缓存昂贵服务调用的结果。Java Web应用程序中的持久缓存?
我希望缓存在JVM重启过程中持续存在。
我用heap
和disk
配置了一个双层ehcache。不幸的是Ehcache只在调用PersistentCacheManager.close()
时才将缓存保存到磁盘。
如何才能让持久性正常工作?我应该定期关闭并重新打开缓存?我应该看看ehcache以外的东西吗?
我正在使用Ehcache
在Web应用程序中缓存昂贵服务调用的结果。Java Web应用程序中的持久缓存?
我希望缓存在JVM重启过程中持续存在。
我用heap
和disk
配置了一个双层ehcache。不幸的是Ehcache只在调用PersistentCacheManager.close()
时才将缓存保存到磁盘。
如何才能让持久性正常工作?我应该定期关闭并重新打开缓存?我应该看看ehcache以外的东西吗?
Ehcache使用分层模型 - 写入缓存的数据总是放在最低层 - 磁盘上。然后在发生读取操作时,将频繁访问的值拉入堆层以便更快地检索。因此,数据将在操作期间写入磁盘,提供比堆更大的缓存空间。
为了保证高速缓存的完整性和JVM重启后恢复数据的能力,需要调用PersistentCacheManager.close()
。但这并不意味着它必须在应用程序的生命中发生,只需要一个正确的Web应用程序关闭序列而不是简单地杀死JVM。
我建议你使用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应用程序容器故障,兵马俑服务器故障),您的数据仍然完好无损,这要归功于您的冗余建立。
制作可从光盘存储加载的缓存实际上非常困难。可能* Ehcache *决定将其缓存存储在内存中足够好。我想你可能需要多看看,找出你需要的东西。寻找由数据库支持而不是平面文件的东西,因为如果要保存对象并实时检索它们,基本上就是您需要的。 (平面文件仅用于启动/关闭保存。) – markspace
您的应用程序听起来像与SQLite3的完美匹配。 – MarsAtomic