Spring @Cachable更新数据

时间:2013-04-26 11:31:52

标签: java database spring caching

示例来自:SpringSource

@Cacheable(value = "vets")
public Collection<Vet> findVets() throws DataAccessException {
    return vetRepository.findAll();
}

findVets()如何正常工作?

第一次,它从vetRepository获取数据并将结果保存在缓存中。但是如果在数据库中插入新的兽医会发生什么 - 缓存更新(开箱即用)行为?如果没有,我们可以将其配置为更新吗?

<小时/> 修改:

但如果从外部源(例如使用相同数据库的应用程序)更新数据库会发生什么?

3 个答案:

答案 0 :(得分:3)

@CacheEvict("vets")    
public void save(Vet vet) {..}

您必须告诉缓存对象是陈旧的。如果数据在不使用您的服务方法的情况下发生变化,那么您当然会遇到问题。但是,您可以使用

清除整个缓存
@CacheEvict(value = "vets", allEntries = true)    
public void clearCache() {..}

这取决于缓存提供商。如果另一个应用程序更新数据库而不通知您的应用程序,但它使用相同的缓存,那么另一个应用程序也可能更新缓存。

答案 1 :(得分:0)

它不会自动执行,并且缓存无法知道数据是否已从外部引入。

检查@CacheEvict,这将有助于您在基础集合发生任何更改时使缓存条目无效。

@CacheEvict(value = "vet", allEntries = true)
public void saveVet() {
  // Intentionally blank
}
  

<强> allEntries
  是否删除了缓存中的所有条目   默认情况下,仅删除关联键下的值。请注意,指定将此参数设置为true并且不允许指定键。

答案 2 :(得分:0)

您还可以在创建新条目的方法上使用@CachePut。返回类型必须与@Cachable方法中的相同。

@CachePut(value = "vets")
public Collection<Vet> updateVets() throws DataAccessException {
    return vetRepository.findAll();
}

在我看来,外部服务必须使用相同的方法。