Spring @Cacheable 不缓存
Spring @Cacheable not caching
使用 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
方法(在其上定义了缓存)与调用它的 class 相同。该方法基本上调用 DAO 来查询列表。如果我将 getMyList
移到另一个仅充当代理的 class ,然后我更改原始调用程序以调用这个新代理,那么缓存就会起作用。我无法解释为什么。有任何输入吗?
想象一下你去动物园。您 进入一次入口 并支付入场费。之后你可以参观狮子、老虎等等……你不必每次都付钱,因为你在进去的时候就付了钱。如果你玩腻了想去别的动物园,你就得出去,去下一个,再付钱。
您的 Class 是动物园,您的方法是动物,缓存代理是入口。当有人调用你的 class 时,它会通过缓存一次。当她进入并调用相同 class 的另一个方法时,它不会再次通过缓存。只有出去再进来,才经过Cache。
你可以使用一个讨厌的技巧来覆盖这个叫做 inject yourself:
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";
}
}
Ruben 的回答绝对正确,但我会添加一些可能会给其他人带来麻烦的东西(就像我一样)。该注释似乎仅适用于 public 方法。即使它在不同的 class 中,它也不会在 package protected 上工作。
@Cacheable 不起作用的最有趣的原因是你 "using"
springfox.documentation.annotations.Cacheable
而不是
org.springframework.cache.annotation.Cacheable
请注意,当您(还)没有正确的依赖项并且您的 IDE 自动导入时很容易发生这种情况。
使用 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
方法(在其上定义了缓存)与调用它的 class 相同。该方法基本上调用 DAO 来查询列表。如果我将 getMyList
移到另一个仅充当代理的 class ,然后我更改原始调用程序以调用这个新代理,那么缓存就会起作用。我无法解释为什么。有任何输入吗?
想象一下你去动物园。您 进入一次入口 并支付入场费。之后你可以参观狮子、老虎等等……你不必每次都付钱,因为你在进去的时候就付了钱。如果你玩腻了想去别的动物园,你就得出去,去下一个,再付钱。
您的 Class 是动物园,您的方法是动物,缓存代理是入口。当有人调用你的 class 时,它会通过缓存一次。当她进入并调用相同 class 的另一个方法时,它不会再次通过缓存。只有出去再进来,才经过Cache。
你可以使用一个讨厌的技巧来覆盖这个叫做 inject yourself:
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";
}
}
Ruben 的回答绝对正确,但我会添加一些可能会给其他人带来麻烦的东西(就像我一样)。该注释似乎仅适用于 public 方法。即使它在不同的 class 中,它也不会在 package protected 上工作。
@Cacheable 不起作用的最有趣的原因是你 "using"
springfox.documentation.annotations.Cacheable
而不是
org.springframework.cache.annotation.Cacheable
请注意,当您(还)没有正确的依赖项并且您的 IDE 自动导入时很容易发生这种情况。