0

Ehcache用来缓存 Web 应用程序中昂贵的服务调用的结果。

我希望缓存在 JVM 重新启动时保持不变。

heap我用和配置了一个 2 层 ehcache disk。不幸的是,Ehcache 仅在调用时将缓存保存到磁盘PersistentCacheManager.close()

我怎样才能让持久性正常工作?我应该定期关闭并重新打开缓存吗?我应该为此查看 ehcache 以外的其他内容吗?

4

2 回答 2

0

我建议您在 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 应用程序容器故障、兵马俑服务器故障)的情况下,由于设置的冗余,您的数据仍然完好无损。

于 2017-09-05T13:53:34.043 回答
0

Ehcache 使用分层模型 - 写入缓存的数据始终放置在最低层 - 在您的情况下是磁盘。然后在发生读取时,将频繁访问的值拉入堆层以更快地检索。所以数据会在操作过程中写入磁盘,提供比堆更大的缓存空间。

为了保证缓存的完整性和 JVM 重启后恢复数据的能力,PersistentCacheManager.close()需要调用。但这并不意味着它必须在您的应用程序生命周期内发生,只是您需要一个适当的 Web 应用程序关闭顺序,而不是简单地杀死 JVM。

于 2017-09-05T08:44:31.810 回答