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

Попробуйте это. Я бы использовал range1 или что-то отличное от range для имени переменной. Также прочитайте , как избежать выбора . Вам, вероятно, придется проверить размер диапазонов, range1 должен быть одной ячейкой или иметь тот же размер, что и rangerc.

Sub main()

Dim rangeSrc As range, range1 As range

Set rangeSrc = Application.InputBox("Select src Range", "select src range", Type:=8) 'type 8 = range
Set range1 = Application.InputBox("select des range", "select des range", Type:=8)

If Not rangeSrc Is Nothing And Not range1 Is Nothing Then
    rangeSrc.Copy range1
End If

End Sub

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
поделиться
Другие вопросы по тегам:

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