Есть ли способ получить ResultSet, который вы получаете от запуска JDBC-запроса, чтобы быть лениво загруженным? Я хочу, чтобы каждая строка была загружена, поскольку я запрашиваю ее, а не заранее.
Java JDBC Lazy-Loaded ResultSet
Ответ 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, это всего лишь подсказка).
Ответ 5
Вы найдете это ЛОТО легче, используя hibernate. В основном вы будете рулон, если используете jdbc напрямую.
Стратегии выборки в спящем режиме очень настраиваются и, скорее всего, будут предлагать параметры производительности, о которых вы даже не подозревали.