Java Web应用程序中的持久缓存?

时间:2017-09-02 23:09:50

标签: java caching ehcache ehcache-3

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

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

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

如何让持久性正常工作?我应该定期关闭并重新打开缓存吗?我应该为ehcache寻找其他东西吗?

2 个答案:

答案 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应用程序容器故障,兵马俑服务器故障),由于设置冗余,您的数据仍然完好无损