首页 文章

Spring @Cacheable没有缓存

提问于
浏览
3

使用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>

我想要缓存数据库结果 . 由于此方法没有参数,因此我选择了方法名称作为缓存键 .

当我测试这个时,每个方法调用都会遇到数据库,我不知道为什么 . 有任何想法吗?


UPDATE

所以经过故障排除我发现了一些有趣目前, getMyList 方法(在其上定义了缓存)与调用它的同一个类 . 该方法基本上调用DAO来查询列表 . 如果我将 getMyList 外部移动到另一个只充当代理的类,然后我改变原始调用者来调用这个新代理,那么缓存就可以了 . 我无法解释原因 . 任何输入?

2 回答

  • 13

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

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

    你可以使用一个讨厌的技巧来覆盖这个名为 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";
        }
    }
    
  • 0

    Ruben 's answer is definitely correct, however I'将添加其他可能给别人带来麻烦的东西(就像它让我一样) . 注释似乎仅适用于 public 方法 . 它在另一个 class 赢得了't work on package protected even if it' .

相关问题