У меня возникают проблемы с @Cacheable, используя несколько параметров и разбиение на страницы.
@Cacheable(value = "books", key = "#p0")
public List<Book> findBooks(Long loggedUserId, String q, Integer firstResult, Integer maxResults) {
...
return result;
}
Проблема заключается в том, когда я вызываю метод в первый раз, содержимое кэшируется с успехом, и результат подобен ожидаемому. Но когда я вызываю второй раз, возвращаемый результат равен первому. Если я отключу кеш или удалю ключ, результаты будут разными.
Использование ключа является обязательным, поскольку иногда кеш указанного пользователя удаляется.
Благодарю.
Я думаю, что ваша проблема заключается в недостаточном понимании аннотации Cacheable, и вы используете ее. Поэтому позвольте мне посмотреть, смогу ли я помочь
Ваша аннотация @Cacheable (value = "books", key = "# p0")
Это означает, что когда этот метод вызывается, он будет принимать первый параметр и искать его в кеше, а если есть результат, он будет возвращен вместо выполнения метода. ТОЛЬКО ПРОВЕРЯЕТ ПЕРВЫЙ ПАРАМЕТР.
Кэш-ключ должен быть тем, что однозначно идентифицирует набор результатов. В этом случае идентификатор пользователя является общим для нескольких результатов и не однозначно идентифицирует страницу.
Вы знаете, что ваш прецедент лучше, чем я, но что-то вроде этого, вероятно, будет лучше:
@Cacheable(value = "books", key = {"#p1","#p2","#p3"})
public List<Book> findBooks(Long loggedUserId, String q, Integer firstResult, Integer maxResults) {
...
return result;
}
Вышеуказанное будет кэшировать на основе поискового запроса и индекса страницы (начало и конец результатов). Поскольку я не знаю вашего случая использования, я не знаю, почему здесь находится идентификатор пользователя, но из информации, которую у меня есть, эти три должны однозначно идентифицировать страницу результатов.