在类中添加缓存

时间:2019-05-07 06:26:03

标签: spring

我有一个impl类,其中有2个更新方法,method1正在更新数据库中的完整行,而method2仅更新该表的数据库中的一列。

现在我需要在这里使用@Caceable和@CacheEvict,在这种情况下如何使用?

1 个答案:

答案 0 :(得分:0)

从Spring 3.1开始,新功能允许缓存和逐出方法,从而在可能的情况下避免使用占用大量资源的方法。通过新的@Cacheable@CacheEvict批注启用了缓存。

缓存的一个示例是例如数据库活动。我们可以将@Cacheable批注应用于查找操作,然后将@CacheEvict应用于更新/删除操作。从这种意义上讲,缓存的工作方式与Hibernate或JPA中的二级缓存非常相似。

要在find方法上启用缓存,该方法需要使用@Cacheable批注进行批注,以标识要使用的缓存。 Spring允许定义多个缓存,每个缓存可以由不同的缓存抽象支持。

@Cacheable("items") //@Cacheable(value = "items", key = "#itemId")
public Item find(long itemId) {
    Item item = entityManager.find(Item.class, itemId);
    return item;
}

是时候调用find方法了,Spring检查指定的缓存以查看操作结果是否已经被缓存,因此是否可以从缓存中返回结果而不是调用该方法。 Spring使用方法参数作为键,因此在本例中为itemId参数。

要在数据库中更新对象时从缓存中逐出条目,可以使用@CacheEvict批注。同样,此批注使用一个参数来标识要使用的缓存。

@CacheEvict(value = "items", key = "#item.id")
public void updateItem(Item item) {
    entityManager.merge(item);
}

编辑:

@CacheEvict 用于高速缓存删除/ cache-cleanup操作。 @CacheEvict注释表示某个方法(或类中的所有方法)触发缓存逐出操作,从而从缓存中删除特定的[或所有]项目。各种属性提供了完整的控制,以强制执行缓存驱逐所需的行为。

例如,

@CacheEvict(value = "products", key = "#product.name")
public void refreshProduct(Product product) {
    //This method will remove only this specific product from 'products' cache.
} 

@CacheEvict(value = "products", allEntries = true)
public void refreshAllProducts() {
    //This method will remove all 'products' from cache, say as a result of flush-all API.
}