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二级缓存,它会自动为您执行缓存条目生命周期工作。
- Hibernate和NonUniqueObjectException
- org.hibernate.HibernateException:无法实例化默认tuplizer
- Hibernate合并
- 无法解析org.springframework.transaction.annotation.Transactional的依赖项
- JPA / Hibernate双向多对一导致StackOverflowException
- 无法在一对多关系hibernate注释中插入null
- 在使用FlushMode.AUTO调用session.close()时,Hibernate会刷新我更新的持久对象吗?
- 在运行时动态禁用hibernatevalidation注释?
- 为什么Hibernate没有为MySQL创建数据库?