Что делает resultSet.next ()

1

У меня простой вопрос. Если моя процедура возвращает 500 строк, то в строке 1 мой результирующий набор содержит 500 строк. Это означает, что теперь все записи присутствуют в этом объекте resultet. Я прав?

Если итерация rs.next требует времени, это означает, что она не связана с производительностью хранимых процедур, потому что у нас уже есть объект набора результатов на стороне Java, который содержит все 500 записей. Я прав?

rs = (ResultSet)callableStatement.getObject(1);
logger.debug("Iterating ResultSet Starts");
Bean bean = null;
while(rs.next()) {
    logger.debug("some logic but commented to check performance");     
}
  • 1
    Вы уже задавали подобный вопрос здесь. Вам пора в Google.
Теги:
jdbc

2 ответа

2
Лучший ответ

У параметров CallableStatement и ResultSet есть размер выборки, который решает, сколько строк за раз извлекается из курсора при повторении через результирующий набор. По умолчанию вы не получаете все 500 строк, вы получаете количество строк до размера выборки драйвера. Согласно этой документации Oracle JDBC размер выборки по умолчанию Oracle намного ниже:

По умолчанию, когда Oracle JDBC выполняет запрос, он получает результирующий набор из 10 строк за раз из курсора базы данных. Это значение по умолчанию для предварительной выборки Oracle. Вы можете изменить количество строк, полученных при каждой поездке, на курсор базы данных, изменив значение префикса строки (см. "Предварительная выборка Oracle Row" для получения дополнительной информации).

JDBC 2.0 также позволяет указать количество строк, полученных с каждой поездкой в оба конца базы данных для запроса, и этот номер называется размером выборки. В Oracle JDBC значение строки-prefetch используется как размер выборки по умолчанию в объекте-предложении. Установка размера выборки переопределяет параметр выборки строки и влияет на последующие запросы, выполняемые через этот объект-оператор.

Размер выборки также используется в результирующем наборе. Когда объект Statement выполняет запрос, размер выборки объекта оператора передается объекту набора результатов, создаваемому запросом. Однако вы также можете установить размер выборки в объекте набора результатов, чтобы переопределить размер выборки выписки, который был передан ему. (Также обратите внимание, что изменения, внесенные в размер выборки объекта утверждения после создания результирующего набора, не повлияют на этот набор результатов.)

При настройке по умолчанию 10 ваш код будет совершать 50 раундов, чтобы получить все данные из вызова процедуры. (Эта документация довольно старая - она говорит о JDBC 2.0, как будто она новая, поэтому она может быть устаревшей, вы должны проверить, для чего установлен ваш размер выборки.) Изменение размера выборки, чтобы вернуть все строки сразу должны минимизировать накладные расходы при поездках по сети.

1

Это означает, что теперь все записи присутствуют в этом объекте resultet. я прав?

Обычно это неверно. ResultSet обычно является абстракцией на курсоре базы данных, который будет извлекать записи набора результатов по требованию, когда будет вызван next.

Только в некоторых исключительных случаях вы получите так называемый "клиентский курсор", что означает, что все данные были скопированы на вашу сторону заранее. Это нежелательное поведение и является обходным решением для случаев, когда спецификация JDBC требует того, что база данных не поддерживает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню