Итерирование ResultSet с использованием JDBC для Oracle занимает много времени около 16 секунд? - программирование
Подтвердить что ты не робот

Итерирование ResultSet с использованием JDBC для Oracle занимает много времени около 16 секунд?

while( result_set.next() )
{
  ...
}

Я использую System.nanoTime() и вычисляю время, для каждой итерации время занимает миллисекунды, но общий цикл занимает около 16 секунд. Я рассматриваю возможную причину того, что тест состояния занимает много времени, функция next().

FYI Я подключаюсь к удаленному серверу базы данных, и запрос выбора, который я делаю, завершается в миллисекундах, снова вычисляемых с использованием вышеупомянутого метода. Любые причины, по которым это происходит, и как я могу принести время для итерации результатов до макс. Секунды?

EDIT:

Я имею дело с около 4000 записей, и каждая запись содержит около 10 столбцов, каждый из которых имеет размер около 10 символов

EDIT2 Спасибо setFetchsize() сделал волшебство, удивительный, удивительный

4b9b3361

Ответ 1

Попробуйте изменить размер выборки ResultSet. По умолчанию драйвер Oracle JDBC получает набор результатов только по 10 строк за раз из курсора базы данных. Это может не значительно улучшить производительность, но есть много других возможностей, чтобы заставить драйвер работать быстрее.

Ответ 2

Я установил таблицу с 4000 строк и 10 столбцов по 10 символов и выполнил простой тест производительности, используя следующий подход (RealTimeCounter - это класс, который измеряет реальное время между start() и stop())

List<String> myResult = new ArrayList<>();
ResultSet rs = s.executeQuery("SELECT * FROM Performance");

RealTimeCounter rtc = new RealTimeCounter();
rtc.start();
while(rs.next()) {
    myResult.add(rs.getString(1));
}
rtc.stop();
System.out.println(rtc);

Результаты:

  • Размер выборки по умолчанию: время выполнения составляет ок. 20 секунд
  • выборка size = 100: время выполнения приблизительно 2.2 сек
  • fetch size = 500: время выполнения приблизительно 450 мс
  • fetch size = 2000: время выполнения приблизительно 120 мс
  • fetch size = 4000: время выполнения приблизительно 50 мс
  • fetch size = 4001: время выполнения приблизительно 10 мс (!!)

Таким образом, размер выборки имеет, что существенно влияет на скорость выполнения.


Обратите внимание, что с другой стороны, размер выборки влияет на потребление памяти. Интересно, что быстрый анализ с использованием Runtime.getRuntime().freeMemory(); до и после приведенного выше кода показал, что воздействие намного меньше, чем я ожидал. Я получил следующие цифры:

  • Размер выборки по умолчанию: 665k
  • fetch size = 100: 665k
  • fetch size = 500: 665k
  • выборка = 2000: 743k
  • fetch size = 4000: 821k
  • выборка = 4001: 861k