我在 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 时,第二个方法返回第一个方法结果。 实际上,我有很多服务因此,我希望使用常用值来缓存特定用例。 现在我的问题是:
答案 0 :(得分:2)
- 我该如何解决这个问题?
我认为zoneMastNo
和areaMastNo
是完全不同的键,我的意思是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)