gpt4 book ai didi

java - 在 Spring/Hibernate 中正确使用缓存

转载 作者:行者123 更新时间:2023-11-30 08:41:59 25 4
gpt4 key购买 nike

项目 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);

也使用“xobjects”缓存的 Hibernate。

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

key = "#result.id"

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

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

最佳答案

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

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

关于java - 在 Spring/Hibernate 中正确使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34763402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com