【问题标题】:Ehcache eternal attribute usage with READ_WRITE objects带有 READ_WRITE 对象的 Ehcache 永恒属性用法
【发布时间】:2013-03-27 23:32:51
【问题描述】:

我在我的项目中将 Ehcache 设置为 Hibernate 的二级缓存。所有对象都将通过 Hibernate 进行更新,并具有 CacheConcurrencyStrategy.READ_WRITE 的缓存策略。在我看来,缓存中不应该有陈旧的数据,因为如果发生更新,该对象将从缓存中删除。在应用程序之外不会发生对数据库的更新。

我的问题是,在定义缓存时,将永恒属性设置为 true 是否有意义。我想不出对象应该从缓存中过期的任何原因,因此倾向于将永恒设置为真。我是否误解了 Ehcache 的行为方式?

【问题讨论】:

    标签: java hibernate ehcache


    【解决方案1】:

    我认为这取决于几件事。

    您的实体有多“长寿”?如果您处理永远不会删除的实体,它们将永远存在于您的缓存中,占用内存。如果它们只被处理一次 - 与被频繁访问相反,这是没有意义的。

    您的缓存有多大?它们是否溢出到磁盘?您使用哪种内存回收策略?
    我假设您限制缓存大小,因此将更多元素放入缓存中会导致驱逐发生,因此您需要考虑适当的驱逐策略;因为这里的错误选择可能会导致缓存未命中,否则可以避免。它还可能导致您最想避免的磁盘 I/O(取决于您的配置)。

    作为积极的指标,您可以使用永久缓存

    • 如果要缓存的对象数量相对较少且不会超过缓存大小
    • 您会定期(例如每天)定期重启应用程序(并清除缓存),这样缓存大小就不会受到影响
    • 如果经常访问相同的对象,因此您可以有意义地使用 LRU 或 LFU 驱逐策略

    请注意,这些或多或少是经验法则;具体情况可能需要具体评估;)

    【讨论】:

    • 感谢您的回答!我的实体将被频繁访问,我认为对象的数量应该很少,但我们仍处于项目的任何早期阶段。随着我们的进展和调整设置,我会牢记您的观点。
    • 那么这是否意味着在 OP 描述的场景中,我可以使用 eternal=true 例如只包含配置数据的小表,这些数据只能通过 Hibernate 更新? (我在这里考虑不同的缓存区域)
    • @StefanHaberl:只要只有一个JVM在运行,你当然可以这样做。
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2012-02-16
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多