5

示例来自:SpringSource

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

究竟是如何findVets()工作的?

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


编辑:

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

4

3 回答 3

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

你必须告诉缓存一个对象是陈旧的。如果数据更改而不使用您的服务方法,那么您当然会遇到问题。但是,您可以使用清除整个缓存

@CacheEvict(value = "vets", allEntries = true)    
public void clearCache() {..}

不过,这取决于缓存提供程序。如果另一个应用程序在没有通知您的应用程序的情况下更新数据库,但它使用相同的缓存,那么另一个应用程序可能也会更新缓存。

于 2013-04-26T11:39:21.433 回答
0

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

@CacheEvict如果基础集合发生任何更改,请检查哪些将帮助您使缓存条目无效。

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

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

于 2013-04-26T11:38:52.980 回答
0

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

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

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

于 2017-08-10T08:39:49.837 回答