Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring@Cachable更新数据_Java_Database_Spring_Caching - Fatal编程技术网

Java Spring@Cachable更新数据

Java Spring@Cachable更新数据,java,database,spring,caching,Java,Database,Spring,Caching,示例来自: @Cacheable(value=“vets”) 公共集合findVets()引发DataAccessException{ 返回vetRepository.findAll(); } findVets()究竟是如何工作的 它第一次从vetRepository获取数据,并将结果保存在缓存中。但是如果在数据库中插入一个新的vet,会发生什么呢?缓存是否会更新(开箱即用的行为)?如果没有,我们可以将其配置为更新吗 编辑: 但是,如果数据库是从外部源(例如,使用相同数据库的应用程序)更新的

示例来自:

@Cacheable(value=“vets”)
公共集合findVets()引发DataAccessException{
返回vetRepository.findAll();
}
findVets()
究竟是如何工作的

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


编辑:


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

它不会自动进行更新,缓存也无法知道数据是否已从外部引入

选中
@cacheexecute
,这将帮助您在基础集合发生任何更改时使缓存项无效

@CacheEvict(value = "vet", allEntries = true)
public void saveVet() {
  // Intentionally blank
}
allEntries
是否删除缓存中的所有条目。
默认情况下,仅删除关联键下的值。请注意,不允许指定将此参数设置为true并指定密钥

您必须告诉缓存对象已过时。如果数据在不使用您的服务方法的情况下更改,那么您当然会遇到问题。但是,您可以使用清除整个缓存

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

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

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

@CachePut(value = "vets")
public Collection<Vet> updateVets() throws DataAccessException {
    return vetRepository.findAll();
}
@CachePut(value=“vets”)
公共集合updateVets()引发DataAccessException{
返回vetRepository.findAll();
}

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

它们可以共享相同的缓存提供程序吗?理论上:可以。但缓存必须作为单独的应用程序运行。Spring默认提供程序只是一个简单的映射。当我在save/update方法上使用
@cacheexecute
和在findAll上使用
@Cacheable
时,它可以很好地工作。当我尝试
@CachePut
时,它总是导致调用该方法,并在保存/更新时将其结果存储在关联的缓存中,但不会返回更新的记录。你能分享一下你的想法吗?为什么这是公认的答案?问题不在于更新数据,而在于如何清除数据,以便在再次调用方法时填充数据。依我拙见
@CacheEvict(value = "vets", allEntries = true)    
public void clearCache() {..}
@CachePut(value = "vets")
public Collection<Vet> updateVets() throws DataAccessException {
    return vetRepository.findAll();
}