Spring @Cacheable没有缓存

时间:2015-10-07 14:10:27

标签: spring caching ehcache

将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移到另一个只充当代理的类,然后我改变原始调用者来调用这个新代理,那么缓存就可以了。我无法解释原因。有什么输入吗?

3 个答案:

答案 0 :(得分:13)

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

您的类是动物园,您的方法是动物,高速缓存代理是入口。当有人打电话给你的班级时,它会通过缓存一次。当她进入并调用同一类的其他方法时,它不会再次通过缓存。只有当你再次出去时,才能通过缓存。

你可以使用一个讨厌的技巧来覆盖这个名为自己注入

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";
    }
}

答案 1 :(得分:0)

Ruben的答案肯定是正确的,但是我会添加一些可能给其他人带来麻烦的东西(就像我所做的那样)。该注释似乎仅适用于 public 方法。即使在不同的类中,它也不能在受保护的软件包上使用。

答案 2 :(得分:0)

@Cacheable不起作用的最有趣的原因是您正在“使用”

springfox.documentation.annotations.Cacheable

代替

org.springframework.cache.annotation.Cacheable

请注意,当您还没有正确的依赖项并且IDE会自动执行导入时,这很容易发生。