Java JDBC лениво загруженный ResultSet

Существует ли способ получить ResultSet, который Вы получаете из выполнения запроса JDBC, который будет лениво загружен? Я хочу, чтобы каждая строка была загружена, поскольку я запрашиваю это и не заранее.

29
задан Lukas Eder 25 August 2012 в 12:20
поделиться

4 ответа

Краткий ответ:

Используйте Statement.setFetchSize (1) перед вызовом executeQuery () .

Длинный ответ:

Это очень во многом зависит от того, какой драйвер JDBC вы используете. Возможно, вы захотите взглянуть на эту страницу , которая описывает поведение MySQL, Oracle, SQL Server и DB2.

Основные выводы:

  • Каждая база данных (т.е. каждый драйвер JDBC ) имеет собственное поведение по умолчанию.
  • Некоторые драйверы будут уважать setFetchSize () без каких-либо оговорок, тогда как другим потребуется некоторая «помощь».

MySQL - особенно странный случай. См. эту статью . Похоже, что если вы вызываете setFetchSize (Integer.MIN_VALUE) , то он будет загружать строки по одной, но это не совсем понятно.

Другой пример: вот документация по поведению PostgreSQL. Если автоматическая фиксация включена, ResultSet будет извлекать все строки сразу, но если он выключен, вы можете использовать setFetchSize () , как и ожидалось.

И последнее, о чем следует помнить. : эти настройки драйвера JDBC влияют только на то, что происходит на стороне клиента. Сервер по-прежнему может загружать весь набор результатов в память, но вы можете контролировать, как клиент загружает результаты.

36
ответ дан 28 November 2019 в 01:55
поделиться

Не могли бы вы добиться этого, установив размер выборки для вашего оператора в 1?

Если вы выбираете только 1 строку за раз, каждая строка не должна загружаться, пока вы не вызовете next () в ResultSet.

, например,

Statement statement = connection.createStatement();
statement.setFetchSize(1);
ResultSet resultSet = statement.executeQuery("SELECT .....");
while (resultSet.next())
{
  // process results. each call to next() should fetch the next row
}
3
ответ дан Mark 28 November 2019 в 01:55
поделиться

Вы найдете это намного проще, используя Hibernate . В основном вам придется свернуть свои собственные, если вы используете jdbc напрямую.

Стратегии извлечения в спящем режиме легко настраиваются и, скорее всего, предложат варианты производительности, о которых вы даже не знали.

-3
ответ дан Matt 28 November 2019 в 01:55
поделиться

Я думаю, что вам нужно отложить фактическую загрузку самого ResultSet. Вам нужно будет реализовать это вручную.

0
ответ дан 28 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: