@使用Spring 3.1可缓存

@使用Spring 3.1可缓存,spring,jakarta-ee,caching,ehcache,Spring,Jakarta Ee,Caching,Ehcache,我将@Cacheable与Spring 3.1一起使用。我对Cacheable中的值和键映射参数有点混淆。 以下是我正在做的: @Cacheable(value = "message", key = "#zoneMastNo") public List<Option> getAreaNameOptionList(String local, Long zoneMastNo) { //..code to fetch data form database.. return list; }

我将@CacheableSpring 3.1一起使用。我对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;
}
@Cacheable(value=“message”,key=“#zoneMastNo”)
公共列表getAreaNameOptionList(字符串本地,长区域序号){
//..从数据库获取数据的代码。。
退货清单;
}
@可缓存(value=“message”,key=“#areaMastNo”)
公共列表getLocalityNameOptionList(字符串本地,长区域编号){
//..从数据库获取数据的代码。。
退货清单;
}
这里发生的事情,第二种方法取决于第一种方法的选定值, 但问题是假设当我通过zoneMastNo=1和areaMastNo=1时,第二个方法返回第一个方法的结果。 事实上,我有很多服务,因此,我希望使用公共值来缓存特定的用例。 现在我的问题是:

  • 我如何解决这个问题
  • 对每个服务都使用cacheable是一个好主意吗
  • 在指定的时间之后,缓存将完全从内存中删除,而不需要 使用@cacheexecute
问题3: 这取决于缓存过期配置。如果使用ehcache,请更改ehcache.xml中的设置

  • 我如何解决这个问题
我假设
zoneMastNo
areaMastNo
是完全不同的键,我的意思是
zoneMastNo
=
1
List
areaMastNo
=
1
List不同。这意味着您需要两个缓存,一个按区域设置关键帧,另一个按区域设置关键帧。但是,您只显式使用一个名为
message
的缓存。引述:

在上面的代码片段中,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)
@Cacheable(value=“byZone”,key=“#zoneMastNo”)
公共列表getAreaNameOptionList(字符串本地,长区域序号)
//...
@可缓存(value=“byArea”,key=“#areaMastNo”)
公共列表getLocalityNameOptionList(字符串本地,长区域编号)
此外,您确定这些方法不会根据
local
参数产生不同的结果吗?如果没有,它的用途是什么


对每个服务都使用cacheable是一个好主意吗

没有,原因如下:

  • 有些方法足够快
  • …缓存本身就带来了一些开销
  • 有些服务调用其他服务,是否需要在每个层次结构级别上进行缓存
  • 缓存需要大量内存
  • 缓存失效是很困难的

在指定的时间之后,缓存是否会在不使用@cacheexecute的情况下从内存中完全删除


这完全取决于缓存实现。但是每个sane实现都有这样一个选项,例如EhCache。

这意味着如果我在EhCache.xml中定义为:timeToIdleSeconds=“180”timeToLiveSeconds=“180”overflowToDisk=“true”DiskExpireythReadIntervalseconds=“180”,它将在3分钟后删除缓存值?您还可以剪切一些解释元素属性用途的链接吗
@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)