Mysql потоковый набор результатов и jOOQ fetchLazy

Обычно, когда я хочу запросить большой набор результатов, используя Mysql, я пишу это (взято из этого ответа):

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

Сейчас я использую jOOQ 2.0.5 и не могу добиться того же результата.

Я пробовал звонить fetchLazy без удачи, он загружает весь набор результатов в память:

Cursor<Record> result = query.fetchLazy(Integer.MIN_VALUE);

В качестве обходного пути я могу получить SQL-запрос, используя query.getSQL() и создать подходящий Statement выполнить это.

Есть ли другой способ получить потоковые наборы результатов, используя jOOQ?

1 ответ

Решение

Согласно спецификации JDBC, Integer.MIN_VALUE не является действительным аргументом для Statement.setFetchSize() метод:

Дает драйверу JDBC подсказку о количестве строк, которые следует извлечь из базы данных, когда для объектов ResultSet, генерируемых этим оператором, требуется больше строк. Если указанное значение равно нулю, то подсказка игнорируется. Значение по умолчанию равно нулю.

Параметры:

rows количество строк для выборки

Броски: SQLException - если ошибка доступа к базе данных происходит, этот метод вызывается в закрытом операторе, или условие строки>= 0 не удовлетворяется.

Реализации могут бросить SQLException для отрицательных размеров выборки. Следовательно, jOOQ не принимает параметры меньше 0. Вы должны попробовать использовать размер выборки 1 вместо. В то же время, следующая версия jOOQ может нарушить стандарт JDBC для поддержки этой документированной функции MySQL:

https://github.com/jOOQ/jOOQ/issues/1263 (реализовано в jOOQ 2.2.0)

Другие вопросы по тегам