Spring cache EhCache | Данные не обновляются и не удаляются из кеша - PullRequest
0 голосов
/ 03 ноября 2018

Я начинаю изучать абстракцию Spring Cache. Для этой цели я использую Spring boot, Spring Data Jpa, провайдер EhCache.

Мой ehcache.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ehcache>
<ehcache>

    <diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="100"
              eternal="false"
              timeToIdleSeconds="120"
              timeToLiveSeconds="120"
              overflowToDisk="true">
</defaultCache>

<cache name="teams"
       maxElementsInMemory="500"
       eternal="true"
       timeToIdleSeconds="0"
       timeToLiveSeconds="100"
       overflowToDisk="false">
</cache>

Мой сервис:

@CacheConfig(cacheNames = "teams")
@Service
public class TeamService {
    @Autowired
    private TeamRepository teamRepository;
    @Cacheable
    public Team findById(long id) {
        return teamRepository.findById(id).get();
    }
    @Cacheable
    public List<Team> findAll() {
        return teamRepository.findAll();
    }
    @CachePut
    public Team save(Team team) {
        return teamRepository.save(team);
    }
    @CacheEvict
    public void delete(long id) {
        teamRepository.deleteById(id);
    }
}

Мой контроллер:

@RestController
public class TeamController {
    @Autowired
    private TeamService teamService;
    @GetMapping("/teams")
    public List<Team> getAll() {
        return teamService.findAll();
    }
    @GetMapping("/team/{id}")
    public Team getById(@PathVariable long id) {
        return teamService.findById(id);
    }
    @DeleteMapping("/team/{id}")
    public void delete(@PathVariable long id) {
        teamService.delete(id);
    }
    @PostMapping("/team")
    public Team save(@RequestBody Team team) {
        return teamService.save(team);
    }
}

Я выполняю запросы к своему контроллеру ...

Когда я выполняю метод getAll () контроллера, данные кешируются правильно, а затем не выполняются запросы к базе данных в следующий раз. Затем я обновляю и удаляю данные из базы данных, используя соответствующие методы моего контроллера, методы обслуживания которых помечены как @CachePut и @CacheEvict соответственно и должны обновлять кэш. Затем я снова выполняю приведенный выше метод getAll () и получаю тот же ответ, что и в первый раз, но я хочу, чтобы он обновлялся после выполнения запросов на удаление и обновление.

Что я делаю не так или как я могу получить желаемый результат?

1 Ответ

0 голосов
/ 03 ноября 2018

Когда вы помещаете аннотацию @Cachable в метод, чтобы все записи оставались в кэше, добавляется имя по умолчанию, тогда первое кэшируемое отличается от второго кэшируемого, поэтому, если вы хотите работать хорошо, вам нужно добавить имя, которое вы хочу, например:

@Cachable("teams") 

@Cachable("teams") 

@CachePut("teams")

@CacheEvict(value="teams", allEntries=true)

Вы можете получить больше информации по этой ссылке: https://www.baeldung.com/spring-cache-tutorial

Возможно, лучшим решением будет следующее:

@Cachable("team") 

@Cachable("teams") 

@Caching(put = { 
    @CachePut(value="team"), 
    @CachePut(value="teams") })

@Caching(evict = { 
    @CacheEvict(value="team", allEntries=true), 
    @CacheEvict(value="teams", allEntries=true) })
...