我有一个impl类,其中有2个更新方法,method1正在更新数据库中的完整行,而method2仅更新该表的数据库中的一列。
现在我需要在这里使用@Caceable和@CacheEvict,在这种情况下如何使用?
答案 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.
}