gpt4 book ai didi

Spring @Cacheable 不缓存

转载 作者:行者123 更新时间:2023-12-01 07:09:49 29 4
gpt4 key购买 nike

将 Spring 3.2 与 EhCache 2.9 一起使用。我已经注释了一个零参数方法如下:

@Cacheable(value="myList", key="#result.method.name")
protected List<MyObject> getMyList() {
//db query
//return list of results
}

EhCache 配置:
<cache name="myList"
statistics="true"
maxEntriesLocalHeap="1"
timeToLiveSeconds="3600">
<persistence strategy="none" />
</cache>

我希望缓存数据库结果。由于此方法没有参数,因此我选择方法名称作为缓存键。

当我对此进行测试时,每次方法调用都会命中数据库,我不知道为什么。有任何想法吗?

更新

所以在排除故障后,我发现了一些有趣的东西。目前 getMyList方法(在其上定义了缓存)在调用它的同一个类中。该方法基本上调用 DAO 来查询列表。如果我搬家 getMyList在另一个仅充当代理的类之外,然后我将原始调用程序更改为调用此新代理,然后缓存起作用。我无法解释为什么。有输入吗?

最佳答案

想象你去动物园。你穿过入口一次并支付您的入场费。之后你可以参观狮子,老虎等等......你不必每次都付钱,因为你是在进入时支付的。如果你无聊了,想去另一个动物园,你必须出去,去下一个,然后再付钱。

你的类是动物园,你的方法是动物,缓存代理是入口。当有人调用你的类时,它会通过一次缓存。当她在,并调用同一类的另一个方法时,它不会再次通过缓存。只有当您再次进出时,您才会通过缓存。

您可以使用一个讨厌的技巧来覆盖它,称为 给自己注入(inject) :

public class YourClass {
@Autowired
private YourClass instance;

@Cacheable
public String method1() {
// now you go through the cache again
return instance.method2();
}

@Cacheable
public String method2() {
return "2";
}
}

关于Spring @Cacheable 不缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32994544/

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