Я пытаюсь перебрать все объекты кеша, используя ScanQuery и итератор (чтобы не вытащить их сразу из распределенного кеша на локальный клиент):
IgniteCache cache = ignite.getOrCreateCache("test2");
ScanQuery<Integer, Person> scan = new ScanQuery<>();
scan.setPageSize(256);
Iterator<Cache.Entry<Integer, Person>> it = cache.query(scan).iterator();
int id;
while(it.hasNext()) {
id = it.next().getValue().getId();
<...>
}
но приведенный выше код завершается ошибкой, занимая всю доступную память. В то же время это работает хорошо, когда я пытаюсь получить итератор из кэша:
IgniteCache cache = ignite.getOrCreateCache("test2");
Iterator<Cache.Entry<Integer, Person>> it = cache.iterator();
int id;
while(it.hasNext()) {
id = it.next().getValue().getId();
<...>
}
Документы утверждают, что:
QueryCursor представляет набор результатов запроса и допускает прозрачную постраничную итерацию. Всякий раз, когда пользователь начинает перебирать последнюю страницу, он автоматически запрашивает следующую страницу в фоновом режиме.
Так почему происходит сбой зажигания локального узла при переборе кеша с помощью ScanQuery?
UPD:
- Персона - это пример имени, а не фактического имени класса. Фактический класс содержит одно поле типа Integer и 10 строк.
- На самом деле я уже установил размер страницы на меньшее число - 256 вместо значения по умолчанию 1024. Такое же поведение с значением по умолчанию и меньшим значением
- Когда я пытаюсь использовать
cache.query(scan).getAll()
, все идет по-другому, но я не могу использовать значение итератора в цикле while, приложение просто зависло до OOM.
Сообщение об исключении:
31 августа 2018 г. 18:16:15 org.apache.ignite.logger.java.JavaLogger error
SEVERE: ошибка времени выполнения, обнаруженная во время выполнения, выполняемого сеткой: считыватель сокетов [id = 105, name = tcp-disco-sock-reader- # 13, nodeId = 83e986dc-9fc1-433c- 8953-2a11460376a0]
java.lang.OutOfMemoryError: пространство кучи Java
полная трассировка стека: https://pastebin.com/raw/ZpHnRjx8