Oracle OCI - выборка задержек и сбоев
У меня есть программа Oracle OCI, которая работает на различных платформах: SLES Linux, Ubuntu, AIX, Solaris и HP-UX. Я пытаюсь запустить то же самое на Redhat, и у меня возникают трудности.
Проблема возникает при использовании прокручиваемого курсора (вызов OCIStmtExecute
с OCI_STMT_SCROLLABLE_READONLY
) и с помощью функции, которая выполняет бинарный поиск, чтобы получить точный размер набора результатов. В более общем смысле проблема заключается в чтении после конца набора результатов до считывания значения ОК.
Я написал тестовую утилиту, которая выполняет простое утверждение, которое должно вернуть 1 строку (SELECT COUNT(*) FROM xxx
). Затем он извлекает данные из результирующего набора:
Если я сначала получаю строку 1, она работает нормально. Если я затем пройду мимо конца набора результатов, он продолжит работать нормально, когда я вернусь. Но если моя первая проверка после набора результатов, все идет не так:
> rdb_test 1
12:06:32.365 Checking row 1 - OK
> rdb_test 3
12:06:35.510 Checking row 3 - NO DATA
12:06:35.511 Checking row 2 - NO DATA
12:06:45.549 Checking row 1 - NO DATA
> rdb_test -3
12:06:49.344 Checking row 1 - OK
12:06:49.344 Checking row 3 - NO DATA
12:06:49.345 Checking row 2 - NO DATA
12:06:49.345 Checking row 1 - OK
Также есть странная задержка, 10 с в примере выше, в то время как она извлекает строку, которая должна быть в порядке. В отладчике это глубоко внутри функции OCIStmtFetch2 - что неудивительно в функции __read_nocancel, ожидающей ответа сервера.
Кто-нибудь еще видел эту проблему раньше?
1 ответ
Кажется, проблема связана с библиотекой OCI версии 11. Я только что попробовал библиотеку v10, и, кажется, снова работает нормально с этим. К сожалению, для этого требуется старая версия стандартной библиотеки C++, поэтому я все же предпочел бы избегать этого исправления, если доступна альтернатива.