Я использую jOOQ 3.4.2 для запроса базы данных PostgreSQL с помощью Scala. Я хочу получить небольшие куски результирующего набора за раз, не загружая весь набор результатов в память, так как запрос может возвращать много строк. У меня есть следующий код:Является ли jOOQ fetchLazy() действительно ленивым?
val query = context.selectFrom(table)
.where(conditions)
.orderBy(orderField)
.fetchSize(1)
val cursor = query.fetchLazy()
// Iterate through cursor using cursor.fetchOne()
Вероятно, jOOQ загрузит весь набор результата (или, по крайней мере, огромный кусок результирующего набора) в памяти, когда я звоню fetchLazy()
, прежде чем я даже принести первый строка из курсора (судя по большому числу recvfrom()
системных вызовов, которые я вижу, пока fetchLazy()
вызывается). Я делаю что-то неправильно?
Насколько я знаю, ленивые запросы в postgresql должны выполняться в транзакции, чтобы сделать их действительно ленивыми. Драйвер Postgresql jdbc использует курсоры на стороне сервера, и они работают только в транзакции. –
@AndreyAntukh: Да, это также говорит связанный вопрос переполнения стека. Я быстро обновляю свой ответ –