一尘不染

在Spring / Hibernate中正确使用缓存

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

b。hibernate方式也使用“ xobjects”缓存。

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

键=“#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
但是我需要先对其进行测试。稍后将共享结果。


阅读 185

收藏
2020-06-20

共1个答案

一尘不染

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

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

2020-06-20