Потеряно соединение RPC с удаленным агентом: Oracle подключен к Informix - PullRequest
1 голос
/ 08 июня 2009

У меня проблема с простым средством импорта / обновления данных, которое берет данные из Informix, вставляет их в таблицу в Oracle и обновляет флаг в исходной таблице. Настройка это

Pro*C program calls a PL/SQL procedure
The procedure 
  opens a cursor on Informix, 
  loops through each row
    insert the data into an oracle table
    commit
    update the "new data" flag in Informix (i.e. stop a re-import)
    commit

Два коммита необходимы для остановки определенной ошибки Oracle (я забыл, какая именно, но это потому, что обновляемые таблицы находятся в двух базах данных, и один коммит не может их обработать). Этот код отлично работает для небольшого количества записей (5-10) в исходной таблице, но падает, когда их больше 1000. В журнале предупреждений в каталоге журналов Oracle отображается ошибка «Потеряно соединение RPC с удаленным агентом». В каталоге Informix нет соответствующей ошибки, поэтому я подозреваю, что драйвер виноват. Мы используем Oracle 10.2 с драйвером unixODBC для Red Hat.

У кого-нибудь есть идеи для обхода или, действительно, как это исправить? Кажется, нет никакой полезной информации об этом сообщении об ошибке - большинство страниц просто говорят что-то вроде «Это не проблема Oracle».

1 Ответ

1 голос
/ 09 июня 2009

Обычно COMMIT закрывает открытые курсоры. Возможно, вам придется сделать курсор на Informix курсором WITH HOLD (жаргон ESQL / C - вам придется переводить в ODBC). Вы можете получить несколько строк из-за буферизации; одна операция извлечения может собрать несколько (может быть, более 10) записей из Informix, и вы заметите проблему только тогда, когда придет время вернуться к базе данных еще - когда курсор закрыт.

Мне не совсем удобно это объяснять; UPDATE плюс COMMIT должен пометить курсор как закрытый.

Предполагая, что вы используете драйвер ODBC Informix (в отличие от драйвера ODBC какого-либо другого поставщика для Informix), вы можете отладить его, установив SQLIDEBUG = 2: xyz в среде перед запуском программы. Это должно привести к созданию файла, имя которого начинается с «xyz _ ###», где «###» - это ряд цифр, возможно, шестнадцатеричные. Этот файл затем можно интерпретировать как sqliprint. Он покажет вам информацию, передаваемую между вашим приложением и сервером базы данных Informix, и может показать группировку данных, передаваемых по проводам и т. Д.

...