【发布时间】: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