Java Ehcache永久属性与读写对象的使用

Java Ehcache永久属性与读写对象的使用,java,hibernate,ehcache,Java,Hibernate,Ehcache,我正在将Ehcache设置为项目中Hibernate的二级缓存。所有对象都将通过Hibernate进行更新,并具有CacheConcurrentyStrategy.READ\u WRITE的缓存策略。在我看来,缓存中永远不应该有过时的数据,因为如果发生更新,对象将从缓存中删除。在应用程序之外不会更新数据库 我的问题是,在定义缓存时,将external属性设置为true是否有意义。我想不出任何理由,对象应该从缓存中过期,因此我倾向于将external设置为true。我是否误解了Ehcache的行为

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


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

我认为这取决于几个方面

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

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

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

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

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

谢谢你的回答!我的实体将经常被访问,我认为对象的数量应该很少,但我们仍处于项目的任何早期阶段。在我们进行和调整设置时,我会牢记您的观点。那么,这是否意味着在OP描述的场景中,我可以使用
external=true
例如,对于只包含配置数据的小表,它只能通过Hibernate更新?(我在考虑不同的缓存区域)@StefanHaberl:只要只有一个JVM在运行,你当然可以这样做。