带有Spring 3.1的@Cacheable

时间:2013-01-11 06:49:43

标签: spring java-ee caching ehcache

我在 Spring 3.1 中使用 @Cacheable 。我对Cacheable中的值和键映射参数有点困惑。 这就是我在做的事情:

@Cacheable(value = "message", key = "#zoneMastNo")
public List<Option> getAreaNameOptionList(String local, Long zoneMastNo) {
//..code to fetch data form database..
return list;
}

@Cacheable(value = "message", key = "#areaMastNo")
public List<Option> getLocalityNameOptionList(String local, Long areaMastNo) {
//..code to fetch data form database..
return list;
}

这里发生了什么,第二种方法依赖于第一种方法的选定值, 但问题是当我传递 zoneMastNo = 1和areaMastNo = 1 时,第二个方法返回第一个方法结果。 实际上,我有很多服务因此,我希望使用常用值来缓存特定用例。 现在我的问题是:

  • 我该如何解决这个问题?
  • 使用可缓存的每个服务是否是个好主意?
  • 指定时间后,缓存将完全从内存中删除 使用@CacheEvict?

2 个答案:

答案 0 :(得分:2)

  
      
  • 我该如何解决这个问题?
  •   

我认为zoneMastNoareaMastNo是完全不同的键,我的意思是List<Option> = zoneMastNo的{​​{1}}与{{1}不同} {} 1 = List<Option>。这意味着您需要两个缓存 - 一个按区域键入,另一个按区域键入。但是,您只显式使用一个名为areaMastNo的缓存。引用29.3.1 @Cacheable annotation

1
     

在上面的代码段中,方法findBook与名为message的缓存相关联。

因此,如果我理解正确,您基本上应该使用两个不同的缓存:

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

您还确定这些方法根据books参数不会有不同的结果吗?如果没有,它用于什么?


  

对每个服务使用可缓存是否是个好主意?

不,原因如下:

  • 有些方法足够快
  • ...缓存自身引入了一些开销
  • 某些服务调用其他服务,您是否需要在每个层次结构上进行缓存
  • 缓存需要内存,很多内容
  • 缓存失效很难

  

指定时间后,如果不使用@CacheEvict,

将完全从内存中删除

这完全取决于你的缓存实现。但每个理智的实现都有这样的选择,例如ehcache的。

答案 1 :(得分:0)

问题3:   这取决于您的缓存过期配置。如果您使用ehcache,请更改ehcache.xml中的设置。