Project X包含以下部分:
一个。 Spring Data存储库使用不同的方法,如:
@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);
湾Hibernate也使用&#34; xobjects&#34;高速缓存中。
问题#1 由于有两种方法可以将对象添加到缓存中,因此可能是同一对象出现2次的情况。如何更好地解决这个问题?例如,使用结果对象中的键。类似的东西:
key =&#34;#result.id&#34;
问题#2 当&#34; save&#34;我不想从缓存中驱逐所有对象。调用方法,但我不确定当前的实现是否有效。 &#34;保存&#34;方法有xobject作为输入,所以CacheEvict将它用作驱逐的关键,并且我预计不会发生任何事情。在这里,我相信能够使用与上述魔术键相同的方法会很好。
更新#1 实际上我认为我的提案可以运作,这是一个示例 - https://github.com/zhangkaitao/spring4-showcase/blob/master/spring-cache/src/main/java/com/sishuok/spring/service/UserService2.java 但我需要先测试它。稍后会分享结果。
答案 0 :(得分:2)
您的方法要么不起作用,要么难以维持。除了需要手动维护缓存外,如果要管理它们,还需要将实体实例合并回每个新的Hibernate会话(持久化上下文),因为从自己的缓存返回的实体将始终被分离。 / p>
最好的方法是使用Hibernate二级缓存,它会自动为你做缓存条目生命周期工作。