2017-09-02 54 views
0

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

我希望缓存在JVM重启过程中持续存在。

我用heapdisk配置了一个双层ehcache。不幸的是Ehcache只在调用PersistentCacheManager.close()时才将缓存保存到磁盘。

如何才能让持久性正常工作?我应该定期关闭并重新打开缓存?我应该看看ehcache以外的东西吗?

+0

制作可从光盘存储加载的缓存实际上非常困难。可能* Ehcache *决定将其缓存存储在内存中足够好。我想你可能需要多看看,找出你需要的东西。寻找由数据库支持而不是平面文件的东西,因为如果要保存对象并实时检索它们,基本上就是您需要的。 (平面文件仅用于启动/关闭保存。) – markspace

+0

您的应用程序听起来像与SQLite3的完美匹配。 – MarsAtomic

回答

0

Ehcache使用分层模型 - 写入缓存的数据总是放在最低层 - 磁盘上。然后在发生读取操作时,将频繁访问的值拉入堆层以便更快地检索。因此,数据将在操作期间写入磁盘,提供比堆更大的缓存空间。

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

0

我建议你使用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应用程序容器故障,兵马俑服务器故障),您的数据仍然完好无损,这要归功于您的冗余建立。