【问题标题】:@Cacheable with Spring 3.1@Cacheable 与 Spring 3.1
【发布时间】:2012-12-25 17:43:47
【问题描述】:

我在 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 吗?

【问题讨论】:

    标签: spring jakarta-ee caching ehcache


    【解决方案1】:
    • 我该如何解决这个问题?

    我假设 zoneMastNoareaMastNo 是完全不同的键,我的意思是 List&lt;Option&gt; for zoneMastNo = 1List&lt;Option&gt; for areaMastNo = 1 不同。这意味着您需要两个缓存 - 一个按区域键控,另一个按区域键控。但是,您只明确使用了一个名为message 的缓存。引用29.3.1 @Cacheable annotation:

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

    在上面的sn-p中,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。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这意味着如果我在 ehcache.xml 中定义为: timeToIdleSeconds="180" timeToLiveSeconds="180" overflowToDisk="true" diskExpiryThreadIntervalSeconds="180" 它将在 3 分钟后删除缓存值?你也可以剪一些链接来解释 元素属性的用途
      猜你喜欢
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2020-02-23
      • 2015-04-15
      • 2019-12-02
      • 2018-08-09
      相关资源
      最近更新 更多