Я вызываю процедуру оракула из java, и в результате она возвращает курсор ref. Я помещаю указатель ref в ResultSet, и итерация начинается с него.
String query = "{call ...(...)}";
CallableStatement stmt = conn.prepareCall(query,ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(10000);
.
.
.
stmt.registerOutParameter(x, OracleTypes.CURSOR);
stmt.execute();
Resultset rs = (ResultSet) stmt.getObject(x);
while (rs.next()) { /** Problem occurs here **/
...
}
Проблема в том, что ИНОГДА (не всегда) для некоторых конкретных записей метод ResultSet.next () занимает слишком много времени (например, 100 секунд). Необходимо отметить, что количество возвращаемых записей не превышает 25, и тот же запрос в базе данных ведет себя нормально (выполняется примерно за 6 секунд).
По мере того, как я исследовал больше, я обнаружил, что в моем возвращенном курсоре есть столбец, при удалении которого эта проблема не возникает. Этот столбец на самом деле является ROWNUM (), который включен в курсор результата.
--ORACLE Query snippet:
OPEN result_cursor FOR
SELECT "FirstName","LastName", r
FROM (SELECT ROWNUM r, *
... -- query details
WHERE ROWNUM <= 25)
Я даже не касаюсь этого поля в ResultSet, но оно по-прежнему вызывает эту проблему (что кажется несправедливым :(). Я попытался преобразовать его в строку в процедуре Oracle (объединив ее с ''), предполагая, что тип преобразование могло вызвать эту проблему, но это не повлияло на ситуацию. почему это происходит?
r
из окончательного списка выбора или удаляете фильтрrownum <= 25
; по-видимому, у вас тамorder by
, вы его тоже удаляете? - person Alex Poole   schedule 19.11.2014r
; если у вас 10g, я бы задался вопросом о просмотре переменных привязки, особенно если он прерывистый. Можете ли вы проверить планы выполнения для обоих запросов (используя одинаковые значения привязки)? - person Alex Poole   schedule 19.11.2014