Я использую кеш apache ignite в качестве хранилища данных. Хотелось бы знать, есть ли способ разбить на страницы большую коллекцию данных от клиента. Мне не нужно передавать миллионы записей с сервера на мой веб / мобильный клиент.
private final ClientCache<UUID, Account> accounts;
public List<Account> getAll(int offset, int limit)
{
return accounts.query(new ScanQuery<UUID, Account>()
.setLocal(false))
.getAll()
.stream()
.skip(offset)
.limit(limit)
.map(entity -> entity.getValue())
.collect(Collectors.toList());
}
Это эффективный способ?
Я посмотрел на использование курсора, но API ограничен итератором ...
Спасибо.




Я вижу getAll() в вашем коде. Это заставляет все данные передаваться на вызывающую сторону. Это именно то, чего вы хотели избежать.
Iterator позволяет избежать этой проблемы, поскольку данные загружаются партиями по запросу. Таким образом, вам не нужно загружать все в память одного узла при выполнении запроса. Размер страницы можно настроить, установив свойство ScanQuery # pageSize. По умолчанию он равен 1024. Итератор можно получить, вызвав метод QueryCursor.iterator(). Итак, вместо сохранения смещения вам нужно сохранить итератор.
SQL-запрос ВЫБРАТЬ с указанными LIMIT и OFFSET также является опцией. Но если у вас более одного узла, то записи LIMIT + OFFSET будут загружены с каждого узла в редуктор во время выполнения. Вы должны это учитывать.
@Gadi, вы можете найти всю информацию о запросах сканирования здесь: apacheignite.readme.io/docs/cache-queries#section-scan-queri es Вы можете рассматривать QueryCursor как Iterable. ScanQuery нельзя сказать, с чего начать, но вы можете оставить итератор, не закрывая его до тех пор, пока он больше не понадобится.
Спасибо, @Denis, это сделает очень беспорядочную обработку сеанса, которую я надеялся избежать.
@Gadi, вы всегда можете создать вспомогательный метод для разбивки результатов на страницы, удаления беспорядка из основного потока кода.
Спасибо за этот ответ @Denis. вы можете предоставить пример кода? Можете ли вы дать итератору начальную точку, на которой вы остановились? Немного запутался, как бы вы обслуживали большой набор данных для веб-клиентов, не нарушая сервер ...