EhCache:使用注释的多个对象的@CacheEvict

时间:2012-08-07 21:28:07

标签: ehcache spring-3 spring-el

我理解使用EhCache实现使用内置在CacheManager中的Spring(3.1),在代理模式(默认)中存在某些限制,如下所示:

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)实际上不会从Cache中删除任何内容。我的解决方法是,在上面的服务层,如果我想删除多个玉米饼,我将循环遍历每个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并实际使expached对象失效?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

你可以做两件事之一

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

如果炸玉米饼被读取的次数远远超过被删除的话,那就不那么糟糕了

OR

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

通过调用服务(代理)来调用缓存驱逐。

答案 2 :(得分:1)

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

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

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