Я ищу решение для реализации подкачки для нашей REST-службы на основе Spring Boot с базой данных Cassandra (версия 3.11.3
).Мы используем Spring Boot 2.0.5.RELEASE
с spring-boot-starter-data-cassandra
в качестве зависимости.
Поскольку CassandraRepository<T, ID>
интерфейс Spring Data не расширяет PagingAndSortingRepository
, мы не получаем полную функциональность подкачки, как у JPA
.
Я прочитал документацию Spring Data Cassandra и смог найти возможный способ реализации подкачки с помощью Cassandra и Spring Data, так как для интерфейса CassandraRepository
доступен следующий метод Slice<T> findAll(Pageable pageable);
.Мне известно, что Cassandra не может получить определенную страницу adhoc, и ей всегда требуется ноль страницы для итерации по всем страницам, как это описано в CassandraPageRequest
:
Cassandra-специфичной {@link PageRequest} реализация, обеспечивающая доступ к {@link PagingState}.Этот класс позволяет создавать запрос первой страницы и представляет через пейджинговую систему Cassandra на основе прогресса извлеченных страниц и позволяет только навигацию вперед. Для доступа к определенной странице требуется выборка всех страниц до тех пор, пока не будет достигнута нужная страница.
В моем сценарии использования у нас> 1 000 000 записей базы данных, и мы хотим отобразить их в нашей странице.одностраничное приложение.
Мой текущий подход выглядит следующим образом:
@RestController
@RequestMapping("/users")
public class UsersResource {
@Autowired
UserRepository userRepository;
@GetMapping
public ResponseEntity<List<User>> getAllTests(
@RequestParam(defaultValue = "0", name = "page") @Positive int requiredPage,
@RequestParam(defaultValue = "500", name = "size") int size) {
Slice<User> resultList = userRepository.findAll(CassandraPageRequest.first(size));
int currentPage = 0;
while (resultList.hasNext() && currentPage <= requiredPage) {
System.out.println("Current Page Number: " + currentPage);
resultList = userRepository.findAll(resultList.nextPageable());
currentPage++;
}
return ResponseEntity.ok(resultList.getContent());
}
}
НО при таком подходе мне нужно найти запрошенную страницу при извлечении всех записей базы данных впамяти и итерации, пока я не нашел правильную страницу.Есть ли другой подход к поиску правильной страницы или мне нужно использовать мое текущее решение?
Определение моей таблицы Cassandra выглядит следующим образом:
CREATE TABLE user (
id int, firstname varchar,
lastname varchar,
code varchar,
PRIMARY KEY(id)
);