【问题标题】:Implement caching Spring method level annotations vs Hibernate second level cache实现缓存 Spring 方法级注解 vs Hibernate 二级缓存
【发布时间】:2014-02-04 07:53:46
【问题描述】:

我正在努力实现某些静态数据的缓存。

我有两种方法:

  • 使用 Spring 框架注释使用方法级缓存。
  • 启用二级缓存,以便休眠管理数据的缓存

这些方法中哪一种效果最好? 我必须考虑哪些事情?

【问题讨论】:

  • 我认为很难回答您的第一个问题,因为我认为这可能是自以为是的。但是,在 Hibernate 缓存中您可能会考虑的一件事是它会影响数据写入的方式/时间。我的团队使用 Hibernate,因为它倾向于推迟对 DB 的写入以尝试“优化”它们。我们会看到代码运行,期望数据库反映更改,但它们不存在。这是可配置的行为,但同样需要考虑。
  • @CodeChimp:这不是 Hibernate 2 级缓存的工作方式。它缓存读取但不缓存写入。事务语义总是受到尊重,不管有没有缓存。
  • @JBNizet +1 给你,好先生,教我一些东西。找到这个链接,如果有人感兴趣,它讨论了 Hibernate 中的二级缓存,带有示例,以及一个讨论一级缓存的链接,同样带有示例:howtodoinjava.com/2013/07/02/…

标签: java spring hibernate caching


【解决方案1】:

如果一切都平等,请考虑更喜欢 Spring 对方法调用结果的缓存,原因是在服务层级别进行缓存更容易推理。

Hibernate 二级缓存运行良好,但在我看来它更难推理,而且它有更多的陷阱。例如,它不适用于查询,仅适用于按 Ids 查找或加载惰性关联。

实际上惰性关联的加载默认是关闭的,需要在集合级别使用特定于休眠的注解来启用。

要查询查询的结果,您还需要使用查询缓存,它只缓存 Id 和仅返回原始值的查询。然后根据二级缓存解析缓存查询的 ID。

在这两种情况下以及一般的缓存中,问题通常是找到合适的时机使缓存无效。这两种方式都允许在缓存提供者(如 ehcache)级别配置过期和最大元素/内存数量。

为了显式清除缓存,Spring提供了@CacheEvict方法注解,这里比较推荐clearing the Hibernate second level cache的方法。

还可以看看这篇写得很好的博文:Truly Understanding the Hibernate Second Level and Query caches

【讨论】:

  • +1 用于解释。我同意你的看法。我的第一个想法是,如果我要使用 Spring,会有更多的程序控制,这似乎是合理的。我会浏览你提到的链接。
  • 我会给出完全相反的建议,正是因为使用 Hibernate,您不必自己使缓存无效。如果您写入或删除实体(通过 Hibernate API),缓存将自动保持最新或失效。 Spring 缓存不是这种情况,每次修改正在缓存的数据时都必须显式地使缓存无效(并且意识到这一点)。
  • 在休眠对象映射中关联的子记录怎么样,如果您配置类似于下面的 并将 cachable 设置为 TRUE .setCacheable(true)
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 2014-03-15
  • 2015-05-14
  • 2013-09-05
  • 2017-03-31
  • 2014-06-20
  • 2010-11-16
  • 2014-11-28
相关资源
最近更新 更多