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)