Подтвердить что ты не робот

Java JDBC Lazy-Loaded ResultSet

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

4b9b3361

Ответ 1

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

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

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

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

Основные мероприятия:

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

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

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

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

Ответ 2

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

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

Ответ 4

Существует ответ здесь.

Цитата:

Драйвер Presto JDBC никогда не буферизует весь набор результатов в памяти. API-интерфейс сервера вернет максимум 1 Мбайт данных в драйвер для каждого запроса. Драйвер не будет запрашивать больше данных с сервера до тех пор, пока эти данные не будут потреблены (путем вызова метода next() в ResultSet соответствующее количество раз).

Из-за того, как работает API-интерфейс сервера, размер выборки драйвера игнорируется (по спецификации JDBC, это всего лишь подсказка).

Докажите, что setFetchSize игнорируется

Ответ 5

Вы найдете это ЛОТО легче, используя hibernate. В основном вы будете рулон, если используете jdbc напрямую.

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