我Ehcache
用来缓存 Web 应用程序中昂贵的服务调用的结果。
我希望缓存在 JVM 重新启动时保持不变。
heap
我用和配置了一个 2 层 ehcache disk
。不幸的是,Ehcache 仅在调用时将缓存保存到磁盘PersistentCacheManager.close()
。
我怎样才能让持久性正常工作?我应该定期关闭并重新打开缓存吗?我应该为此查看 ehcache 以外的其他内容吗?
我建议您在 Web 应用程序 JVM 旁边使用Terracotta 集群部署(它也是开源的)。
然后,您将在您的 Web 应用程序上配置 3 层:堆、堆外和集群
<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 使用分层模型 - 写入缓存的数据始终放置在最低层 - 在您的情况下是磁盘。然后在发生读取时,将频繁访问的值拉入堆层以更快地检索。所以数据会在操作过程中写入磁盘,提供比堆更大的缓存空间。
为了保证缓存的完整性和 JVM 重启后恢复数据的能力,PersistentCacheManager.close()
需要调用。但这并不意味着它必须在您的应用程序生命周期内发生,只是您需要一个适当的 Web 应用程序关闭顺序,而不是简单地杀死 JVM。