Выбор ответа Senior JDBC и транзакции обновлено
Чтение миллиона строк из PostgreSQL
Вопрос
Запрос возвращает 10 млн строк, приложение падает с OutOfMemoryError ещё до первой итерации rs.next(). Что сделать с драйвером PostgreSQL?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Выключить autoCommit и задать setFetchSize(n) для чтения курсором. По умолчанию драйвер PostgreSQL загружает весь результат в память.
Варианты ответа
- Увеличить размер стека потока
-Xss, чтобы влез результат - Выключить autoCommit и задать
setFetchSize(n)для чтения курсоромправильный ответ - Вызвать
rs.setFetchDirection(FETCH_REVERSE)перед первымnext() - Использовать Statement вместо PreparedStatement: он не кеширует строки
Разбор
По умолчанию драйвер PostgreSQL загружает весь результат в память. Потоковое чтение включается, когда соединение не в autoCommit и задан fetchSize: драйвер открывает курсор и забирает строки порциями. Размер стека тут ни при чём, направление выборки тоже, Statement ведёт себя так же. В Spring это @Transactional(readOnly = true) плюс Stream<T> из репозитория или JdbcTemplate с fetchSize.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.