gpt4 book ai didi

java - @Cacheable 注解在 Spring 中无法正常工作

转载 作者:行者123 更新时间:2023-12-02 11:40:21 31 4
gpt4 key购买 nike

我在 Spring 中使用 @Cacheable 注解时遇到了奇怪的行为。我有一个标记为 @Cacheable 的方法,它返回 Map:

//dao layer
@Cacheable(value = "Cache1")
public Map<String, String> getNamesByDateAndCurrency(LocalDate date, String currency) {
// Returns some map
}

我从以下方法调用此方法,并使用 retainAll() 方法更改 map :

//service layer
@Autowired
private DaoImpl dao;
...
@Cacheable( value = "Cache2")
public List<Integer> getUUIDs(Integer requestNumber, Set<String> set) {
//some code..
Map<String, String> names = dao.getNamesByDateAndCurrency(params..);
names.keySet().retainAll(set);
//some other code, no any changes of map in further
}

dao.getNamesByDateAndCurrency(params..) 如果我使用相同的参数第二次调用此方法,表达式将按预期返回缓存的数据。

问题在于 getNamesByDateAndCurrency 方法正在缓存执行 retainAll 方法后更改的数据。

我的问题是为什么外部操作 (retainAll) 方法会影响缓存的响应?为什么 getNamesByDateAndCurrency 方法没有返回原始数据?

提前致谢!

最佳答案

Spring缓存通过引用将结果存储在缓存中。然后,使用的缓存框架(我认为在你的例子中是 Ehcache)将根据其配置存储结果。大多数框架默认情况下都会通过引用存储它,因为它要快得多。

您有 2 个解决方案:

  1. 以不可变的方式编写代码。因此,当收到 map 时,不要就地修改它,而是创建一个副本。您可以通过将结果包装在 Collections.unmodifyingMap
  2. 中来确保这一点
  3. 告诉Ehcache按值存储。这有点复杂,因为您需要能够 copy值(value)。但它会透明地运作

请注意,无论您是将数据存储在堆、磁盘还是集群上,默认情况下它都会按预期工作。因为所有这些选项都需要复制键和值。只有堆上才有“按引用”存储优化。

关于java - @Cacheable 注解在 Spring 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48621847/

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