示例来自:SpringSource
@Cacheable(value = "vets")
public Collection<Vet> findVets() throws DataAccessException {
return vetRepository.findAll();
}
findVets()
如何正常工作?
第一次,它从vetRepository
获取数据并将结果保存在缓存中。但是如果在数据库中插入新的兽医会发生什么 - 缓存更新(开箱即用)行为?如果没有,我们可以将其配置为更新吗?
<小时/> 修改:
但如果从外部源(例如使用相同数据库的应用程序)更新数据库会发生什么?
答案 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();
}
在我看来,外部服务必须使用相同的方法。