Mysql потоковый набор результатов и jOOQ fetchLazy - PullRequest
4 голосов
/ 31 марта 2012

Обычно, когда я хочу запросить большой набор результатов, используя 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 Ответ

4 голосов
/ 31 марта 2012

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

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

Параметры:

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

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

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

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

...