【问题标题】:Persistent caching in a Java web app?Java Web 应用程序中的持久缓存?
【发布时间】:2018-02-11 14:59:56
【问题描述】:

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

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

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

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

【问题讨论】:

  • 制作一个可以从磁盘存储加载的缓存实际上非常困难。可能 Ehcache 认为将缓存存储在内存中就足够了。我认为您可能需要多环顾四周才能找到所需的东西。寻找由数据库而不是平面文件支持的东西,因为如果您要保存对象并实时检索它们,这基本上是您所需要的。 (平面文件仅用于启动/关闭保存。)
  • 您的应用程序听起来与 SQLite3 完美匹配。

标签: java caching ehcache ehcache-3


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我建议您在 Web 应用程序 JVM 旁边使用 Terracotta cluster deployment(它也是开源的)。

    然后,您将在您的 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 应用程序容器故障、兵马俑服务器故障)的情况下,您的数据仍然完好无损,这要归功于您的设置冗余.

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      相关资源
      最近更新 更多