Почему после изменений данных в кэше- получаю неактуальные данные при попытке вернуть лист?

118
26 ноября 2020, 04:50

После любой crud операции с кэшом получаю неактуальные данные при попытке вернуть List всех сущностей(метод getAllProxyConfigurations). Почему это может происходить и как это исправить?

При чем другие методы отображают актуальную информацию

 @Cacheable("configuration")
    public List<Configuration> getAllProxyConfigurations() {
        return repository.getAllConfigurations();
}
   @Cacheable(value = "configuration", key = "#root.target.getConfigurationById(#id).serverId")
    public Configuration getConfigurationById(Long id) {
...
   return configuration;
}
 @CachePut(value = "configuration", key = "#configuration.serverId", condition = "#result.id != null")
    public Configuration addOrUpdateConfiguration(Configuration configuration) {
   return configuration;
}
   @Cacheable(value = "configuration", key = "#serverId")
    public Configuration getConfigurationByServerId(String serverId) {...
   return configuration;
}
   @CacheEvict(value = "configuration", key = "#root.target.getConfigurationById(#id).serverId")
    public void deleteConfigurationById(Long id) {
...
}
Answer 1

На момент создания вопроса - не понимал внутренних процессов кэширования. В spring.cache лежит лист из мап, мапы- это кэши,которые называем в параметрах аннотаций, например: @Cacheable(value/name/cacheNames="cache_name") Я хотел ложить в кэш возвращенный лист и работать с эллементами данного листа. Но это в корне не правильно, так как (в моем случае) в мэпу, в одну ячейку ложился бы весь лист лист из эллементов, а в остальные ячейки (из других методов) эллементы, ключами которых выступали бы значения serverId и id. То есть обращение происходило к совершенно разным эллементам.

Поэтму, было принято решение сделать неколько кэшей: для всех эллементов "config_all", для единичных "config_serverId" и "config_id"(так как использовать запись, вроде такой не логично: "#root.target.getConfigurationById(#id).serverId" по причине того, что в любом случае вызывался метод getConfigurationById).

Итог: Убрал аннотации @CachePut на обновление- заменил на @Cacheable. Это позволяет держать в кэше актуальные данные без головной боли

READ ALSO
Как прописать ввод с клавиатуры в TextField и в javafx?

Как прописать ввод с клавиатуры в TextField и в javafx?

Пишу программу с использованием javafx, в ней нужно вводить данные в одно поле TextField, после подсчёта выводить в другоеВ консоли это бы выглядело...

119
Как в javafx прописать взаимодействие между Batton и TextField?

Как в javafx прописать взаимодействие между Batton и TextField?

Как сделать так, чтобы при нажатии batton, программа использовала данные, введённые в TextField?

114
Передача параметра из сервлета в JSP

Передача параметра из сервлета в JSP

Всем приветВопрос такой

87
Чем заархивирован бинарный файл? [закрыт]

Чем заархивирован бинарный файл? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

230