Выбор ответа Senior JDBC и транзакции обновлено

Чтение миллиона строк из PostgreSQL

Вопрос

Запрос возвращает 10 млн строк, приложение падает с OutOfMemoryError ещё до первой итерации rs.next(). Что сделать с драйвером PostgreSQL?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Выключить autoCommit и задать setFetchSize(n) для чтения курсором. По умолчанию драйвер PostgreSQL загружает весь результат в память.

Варианты ответа

  1. Увеличить размер стека потока -Xss, чтобы влез результат
  2. Выключить autoCommit и задать setFetchSize(n) для чтения курсоромправильный ответ
  3. Вызвать rs.setFetchDirection(FETCH_REVERSE) перед первым next()
  4. Использовать Statement вместо PreparedStatement: он не кеширует строки

Разбор

По умолчанию драйвер PostgreSQL загружает весь результат в память. Потоковое чтение включается, когда соединение не в autoCommit и задан fetchSize: драйвер открывает курсор и забирает строки порциями. Размер стека тут ни при чём, направление выборки тоже, Statement ведёт себя так же. В Spring это @Transactional(readOnly = true) плюс Stream<T> из репозитория или JdbcTemplate с fetchSize.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.