实现缓存Spring方法级别注释与Hibernate二级缓存

sou*_*ser 7 java spring caching hibernate

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

我有两种方法:

  • 使用Spring框架注释使用方法级别缓存.
  • 启用二级缓存,以便hibernate管理数据的缓存

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

Ang*_*ity 5

如果所有条件都相同,则考虑首选方法调用结果的 Spring 缓存,原因是在服务层级别进行缓存的推理更简单。

Hibernate 二级缓存工作正常,但在我看来它更难推理并且有更多陷阱。例如,它不适用于查询,仅适用于通过 Id 查找或加载延迟关联。

实际上,默认情况下延迟关联的加载是关闭的,并且需要在集合级别使用特定于休眠的注释启用。

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

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

为了显式清除缓存,Spring提供了@CacheEvict方法注解,为了比较这里推荐的清除Hibernate二级缓存的方式

也可以看看这篇写得很好的博客文章:真正理解 Hibernate 二级缓存和查询缓存

  • 我会给出完全相反的建议,正是因为使用 Hibernate,您不必自己使缓存无效。如果您写入或删除实体(通过 Hibernate API),缓存将自动保持最新或失效。Spring 缓存不是这种情况,每次修改正在缓存的数据(并且知道它)时,您都必须显式地使其无效。 (2认同)