ResultSet.GetRow() отображает номер строки 0 вместо x

#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 возвращала номер строки последней строки, когда результирующий набор был исчерпан, я не могу сказать. Я искал список изменений для этого драйвера, но не смог его легко найти.

К сожалению, вы потеряли удобный способ подсчета количества обработанных строк. По-прежнему возможно определить это количество каким-либо другим способом, но это просто потребует немного больше работы с вашей стороны.