【问题标题】:EhCache: @CacheEvict on Multiple Objects Using AnnotationsEhCache:使用注解的多个对象上的@CacheEvict
【发布时间】:2012-08-07 21:28:06
【问题描述】:

据我所知,使用 EhCache 实现的 Spring (3.1) 内置在 CacheManager 中,根据这篇文章,在代理模式(默认)下存在一定的限制:

Spring 3.1 @Cacheable - method still executed

考虑我的情况:

@CacheEvict(value = "tacos", key = "#tacoId", beforeInvocation = true)
removeTaco(String tacoId) {
    // Code to remove taco
}

removeTacos(Set<String> tacoIds) {
    for (String tacoId : tacoIds) {
        removeTaco(tacoId); 
    }
}

在此存储库方法中,由于上述限制,调用 removeTacos(tacoIds) 实际上不会从缓存中驱逐任何内容。我的解决方法是,在上面的服务层上,如果我想删除多个 taco,我将遍历每个 taco Id 并将其传递给 removeTaco(),并且从不使用 removeTacos()

不过,我想知道是否还有其他方法可以做到这一点。

1) 是否有一个 SpEL 表达式可以传递给密钥,告诉 EhCache 使 Set 中的每个 id 都过期?

e.g.  @CacheEvict(value = "tacos", key = "#ids.?[*]") // I know this isn't valid, just can't find the expression.

或者有没有办法让 removeTacos() 调用 removeTaco 并实际使缓存对象过期?

【问题讨论】:

    标签: ehcache spring-3 spring-el


    【解决方案1】:

    @Caching 注解可用于组合多个相同类型的注解,例如@CacheEvict 或@CachePut,这是Spring 文档中的示例

    @Caching(evict = { @CacheEvict("primary"), @CacheEvict(value="secondary", key="#p0") })
    public Book importBooks(String deposit, Date date)
    

    【讨论】:

      【解决方案2】:

      你可以做两件事之一

      @CacheEvict(value = "tacos", allEntries = true)
      removeTacos(Set<String> tacoIds)
      

      如果 tacos 被阅读的次数比被删除的次数多得多,那还不错

      removeTacos(Set<String> tacoIds) {
          for (String tacoId : tacoIds) {
              getTacoService().removeTaco(tacoId); 
          }
      }
      

      通过调用服务(代理),您可以调用缓存逐出。

      【讨论】:

        【解决方案3】:

        AFAIK @CacheEvict 仅支持删除单个条目(按键)或给定缓存中的所有条目,无法一次删除多个条目。如果您想从缓存中放置、更新或删除多个对象(使用注释),并且您可以切换到 memcached,请查看我的项目 Simple Spring Memcached (SSM)

        自调用不通过代理,因此解决方案之一是切换到代理以外的其他模式。另一种解决方案(我不推荐它)可能会保留对服务中服务的引用(作为自动装配字段)并使用它来调用 removeTaco。

        几个月前,我在一个项目中遇到了类似的问题。它没有使用 Spring Cache,但 SSM 也需要代理。为了让它工作,我将缓存(注释)从服务移动到 DAO(存储库)层。它解决了自我调用的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多