Приходилось ли работать с курсорами в базах данных?
Что проверяют
Как вы читаете большую выборку и понимаете ли, что происходит между базой и приложением. Вопрос быстро переходит к памяти: почему выборка на миллионы строк роняет сервис, хотя вы вроде бы обрабатываете записи по одной.
Как отвечать
Разделите два смысла. Курсор на стороне базы это именованная выборка, по которой ходят порциями, он используется в процедурах и живёт в рамках транзакции. В приложении на Java та же механика прячется за ResultSet: драйвер либо забирает весь результат сразу, либо подтягивает его частями через курсор.
Ключевой момент: потоковое чтение включается явно. Размер порции задаётся через setFetchSize, и для части баз этого мало: например, дополнительно требуется выключенный автокоммит, иначе серверный курсор не создаётся и результат приезжает целиком. Тип результата по умолчанию, движение только вперёд и чтение без обновления, самый дешёвый, и менять его без нужды не стоит.
Скажите и про альтернативы. В ORM для потока есть скроллируемый результат, но контекст сессии нужно периодически чистить, иначе сущности копятся в памяти. Часто вместо курсора удобнее постраничный обход по индексированному ключу, когда следующая порция выбирается условием «ключ больше последнего прочитанного»: такой запрос не деградирует на больших смещениях и не держит одну транзакцию открытой.
Где спотыкаются
Задают размер порции и считают, что поток включился. Остальные условия драйвера не выполнены, результат всё равно материализуется целиком, и приложение падает по памяти на первой же большой таблице.
Делают запрос на каждую строку внутри обхода. Курсор экономит память, но если для каждой записи идёт отдельное обращение к базе, время растёт линейно и упирается в задержку сети. То же самое происходит в ORM, когда сессию не очищают по ходу чтения.
Держат курсор открытым часами. Длинная транзакция мешает базе убирать старые версии строк, а незакрытые ресурсы удерживают соединение из пула. Читающий код закрывает всё через try-with-resources и укладывается в разумное время.