Как правильно разбить кеш зажигания на страницы?

Я использую кеш 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 ограничен итератором ...

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
608
1

Ответы 1

Я вижу getAll() в вашем коде. Это заставляет все данные передаваться на вызывающую сторону. Это именно то, чего вы хотели избежать.

Iterator позволяет избежать этой проблемы, поскольку данные загружаются партиями по запросу. Таким образом, вам не нужно загружать все в память одного узла при выполнении запроса. Размер страницы можно настроить, установив свойство ScanQuery # pageSize. По умолчанию он равен 1024. Итератор можно получить, вызвав метод QueryCursor.iterator(). Итак, вместо сохранения смещения вам нужно сохранить итератор.

SQL-запрос ВЫБРАТЬ с указанными LIMIT и OFFSET также является опцией. Но если у вас более одного узла, то записи LIMIT + OFFSET будут загружены с каждого узла в редуктор во время выполнения. Вы должны это учитывать.

Спасибо за этот ответ @Denis. вы можете предоставить пример кода? Можете ли вы дать итератору начальную точку, на которой вы остановились? Немного запутался, как бы вы обслуживали большой набор данных для веб-клиентов, не нарушая сервер ...

Gadi 05.11.2018 11:37

@Gadi, вы можете найти всю информацию о запросах сканирования здесь: apacheignite.readme.io/docs/cache-queries#section-scan-queri‌ es Вы можете рассматривать QueryCursor как Iterable. ScanQuery нельзя сказать, с чего начать, но вы можете оставить итератор, не закрывая его до тех пор, пока он больше не понадобится.

Denis 05.11.2018 12:14

Спасибо, @Denis, это сделает очень беспорядочную обработку сеанса, которую я надеялся избежать.

Gadi 05.11.2018 14:34

@Gadi, вы всегда можете создать вспомогательный метод для разбивки результатов на страницы, удаления беспорядка из основного потока кода.

alamar 14.11.2018 15:44

Другие вопросы по теме