Правильный способ реализации подкачки для Cassandra с помощью CassandraRepository из Spring Data - PullRequest
0 голосов
/ 26 сентября 2018

Я ищу решение для реализации подкачки для нашей 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)
);
...