Spring / Hibernate中适当的缓存使用

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 save(E entity); 

湾 Hibernate也使用“xobjects”缓存。

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

key =“#result.id”

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

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

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

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