Spring @Cacheable不缓存

用户名

将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另一个仅充当代理的类,然后更改原始调用程序以调用此新代理,则缓存将起作用。我无法解释原因。有输入吗?

鲁本

想象一下您去了动物园。只需进入一次入口并支付入场费。之后,您可以参观狮子,老虎等……您不必每次都付费,因为您在进入时就已经付款了。如果您觉得无聊而又想去另一个动物园,则必须出去,去下一个动物园,然后再付费。

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

您可以使用一个讨厌的技巧来覆盖此问题,即自己注入

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章