2014-10-07 1 views
3

Я использую 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() вызывается). Я делаю что-то неправильно?

ответ

2

Я делаю что-то неправильно?

Не со стороны jOOQ. Именно так вы гарантируете, что как jOOQ (через ResultQuery.fetchLazy(), так и Cursor.fetchOne()) и драйвер JDBC (через ResultQuery.fetchSize(), что соответствует PreparedStatement.setFetchSize()) будут извлекать ровно по одной строке за раз.

Вы можете, однако, столкнуться с this PostgreSQL JDBC driver caveat, заявив, что для работы fetchSize вам нужно выполнить запрос в явной транзакции.

+0

Насколько я знаю, ленивые запросы в postgresql должны выполняться в транзакции, чтобы сделать их действительно ленивыми. Драйвер Postgresql jdbc использует курсоры на стороне сервера, и они работают только в транзакции. –

+0

@AndreyAntukh: Да, это также говорит связанный вопрос переполнения стека. Я быстро обновляю свой ответ –