#java #oracle #jdbc #resultset
#java #Oracle #jdbc #набор результатов
Вопрос:
Недавно мы обновили драйвер Oracle JDBC с ojdbc5 (версия 11gr2) до ojdbc8 (21.3.0.0) и заметили другое поведение, которое мы не можем объяснить.
boolean stillDataToProcess = true;
int bufferSize = 20000;
while (stillDataToProcess) {
ResultSet rs = getData();
for (int i=0; i< bufferSize; i ) {
if (rs != null amp;amp; rs.next()) {
// some stuff
} else {
stillDataToProcess = false
break;
}
}
log.info("row number : " rs.getRow());
// some stuff
}
журналы перед обновлением
row number : 20000
row number : 40000
row number : 60000
row number : 80000
row number : 100000
row number : 120000
row number : 124851
журналы после обновления
row number : 20000
row number : 40000
row number : 60000
row number : 80000
row number : 100000
row number : 120000
row number : 0
Ответ №1:
JavaDoc for ResultSet.getRow()
говорит следующее о значении, которое возвращает этот метод:
номер текущей строки; 0, если текущей строки нет
Однажды rs.next()
был вызван и возвращает false,
, возможно, текущей строки больше нет, потому что вы ушли с конца коллекции строк в результирующем наборе. Итак, насколько я вижу, 0 — это правильное значение, которое нужно возвращать в этой ситуации.
Почему старая версия драйвера JDBC возвращала номер строки последней строки, когда результирующий набор был исчерпан, я не могу сказать. Я искал список изменений для этого драйвера, но не смог его легко найти.
К сожалению, вы потеряли удобный способ подсчета количества обработанных строк. По-прежнему возможно определить это количество каким-либо другим способом, но это просто потребует немного больше работы с вашей стороны.