2013-01-11 42 views
1

我正在使用@CacheableSpring 3.1。我对Cacheable中的值和键映射参数有点困惑。 下面是我在做什么:@Cacheable with Spring 3.1

@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?

回答

0

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

+0

这意味着如果我在ehcache.xml中定义为:timeToIdleSeconds =“180”timeToLiveSeconds =“180”overflowToDisk =“true”diskExpiryThreadIntervalSeconds =“180”它会在3分钟后删除缓存值吗?你也可以剪切一些链接来解释元素的属性的目的 – Balasaheb

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

我假定zoneMastNoareaMastNo是完全不同的键,我的意思是List<Option>zoneMastNo = 1是不一样的List<Option>areaMastNo = 1。这意味着你需要两个缓存 - 一个按区域和另一个按区域键。但是,您明确只使用一个名为message的缓存。引述29.3.1 @Cacheable annotation

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

在上面的代码段中,该方法findBook与名为books所述高速缓存相关联。

所以,如果我理解正确的话,你应该主要使用两种不同的缓存:

@Cacheable(value = "byZone", key = "#zoneMastNo") 
public List<Option> getAreaNameOptionList(String local, Long zoneMastNo) 
//... 
@Cacheable(value = "byArea", key = "#areaMastNo") 
public List<Option> getLocalityNameOptionList(String local, Long areaMastNo) 

而且你确定这些方法会不会有不同的结果取决于local参数?如果不是,它用于什么?


难道对每个服务使用缓存的好主意吗?

否,其原因如下:

  • 一些方法只是速度不够快
  • ...和缓存介绍了一些开销了自己
  • 一些服务调用其他服务,你需要在层次结构的每个级别的缓存
  • 缓存需要的内存,它的很多
  • 缓存失效是很难

经过指定的时间将缓存完全从内存中删除而不使用@CacheEvict?

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