【问题标题】:Proper cache usage in Spring / Hibernate在 Spring / Hibernate 中正确使用缓存
【发布时间】:2016-04-18 05:35:58
【问题描述】:

Project X 包含以下部分:

一个。具有单独方法的 Spring 数据存储库,例如:

@Cacheable(value = "xobjects", unless = "#result == null")
XObject findByParamA(String paramA);

@Cacheable(value = "xobjects", unless = "#result == null")
XObject findByParamB(String paramB);

@CacheEvict("xobjects")
<E extends XObject> E save(E entity);

b. Hibernate 也使用“xobjects”缓存。

问题 #1 由于有两种方法可以将对象添加到缓存中,因此可能会出现同一对象出现 2 次的情况。如何更好地解决这个问题?例如使用来自结果对象的键。比如:

key = "#result.id"

问题 #2 当调用“保存”方法时,我不想从缓存中逐出所有对象,但我不确定当前的实现是否有效。 “保存”方法将 xobject 作为输入,因此 CacheEvict 将使用它作为驱逐的键,并且我期望不会发生任何事情。在这里,我相信能够使用与上面的魔术键相同的方法会很好。

更新 #1 实际上我认为我的建议可行,这是一个示例 - https://github.com/zhangkaitao/spring4-showcase/blob/master/spring-cache/src/main/java/com/sishuok/spring/service/UserService2.java 但我需要先测试一下。稍后会分享结果。

【问题讨论】:

  • 您确定要为此使用 Spring Cache 抽象还是使用 ORM 提供程序的二级缓存,因为它会自动为您完成所有这些事情。
  • 我正在考虑这个,它会很好。我已经用 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 标记了 XObject 并启用了“hibernate.cache.use_second_level_cache”。但是上面的方法没有被缓存。查询缓存会有帮助吗?

标签: java spring hibernate caching


【解决方案1】:

您的方法要么行不通,要么很难维护。除了需要手动维护缓存之外,如果您希望管理实体实例,则需要将它们合并回每个新的 Hibernate 会话(持久性上下文),因为您从自己的缓存返回的实体将始终是分离的。

最好的方法是使用 Hibernate 二级缓存,它会自动为您完成缓存条目生命周期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2012-07-01
    • 2011-10-06
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多