Member 10513986 Ответов: 1

Корпорация Майкрософт SQL сервер, сервера, связанного с базой данных Oracle с ссылку базы данных в другую базу данных Oracle


Всем привет,

Я испытываю проблему с Microsoft SQL Server 2014 (позже называемым (S1)), подключенным к базе данных ORACLE12 (позже называемой (O1)) через связанный сервер. Эта база данных ORACLE также подключается к другой базе данных ORACLE12 (позже называемой (O2)) с помощью ссылки на базу данных. База данных O1 имеет функцию пакета, которая вызывается S1 с помощью afaik MSDTC (это работает, как и ожидалось) каждый раз в отдельной транзакции. Теперь я пытаюсь вызвать другую функцию из базы данных O1 через ссылку базы данных в базе данных O2. Это работает (со стандартной конфигурацией ORACLE) ровно 4 раза и терпит неудачу в 5-й раз с ошибкой ORACLE " ORA-02020:
слишком много ссылок на базы данных используется". Через несколько минут это снова работает (ровно в 4 раза не удается в 5-й раз и так далее). Если я не вызываю функцию на O2 из O1 по ссылке базы данных, то вызов из S1 в O1 работает как заклинание. Как функции O1, так и функции O2 не выполняют никакой фиксации или отката, и доступ к этим функциям очень ограничен, поскольку они специфичны для клиента.

Есть ли у кого-нибудь опыт такого поведения и какие-либо идеи, как обойти эту проблему?

Любая помощь будет оценена по достоинству.

Что я уже пробовал:

Я уже изменил параметр ORACLE OPEN_LINKS, но единственным результатом было то, что он работает 10 раз, если я установил параметр равным 10. Как описано, вызов от S1 к O1 работает так, как ожидалось, но как только появляется O2, он завершается неудачей после времени OPEN_LINKS.

1 Ответов

Рейтинг:
0

CHill60

Это известная проблема с Oracle. Чтобы преодолеть его, вам нужно явно закрывать соединение после каждого запроса (так как Oracle оставит соединение открытым до окончания сеанса).

Более подробная информация и инструкции от здесь[^]

Воспользуйся

DBMS_SESSION.CLOSE_DATABASE_LINK ('DB LINK NAME')


Цитата:
Однако не всегда возможно изменить существующий код. Возможным решением может быть создание процедуры, которая закроет все открытые ссылки БД и запустит ее после или перед запросами, использующими ссылки базы данных.
create or replace procedure rollback_and_close_db_links
 authid current_user is
 begin
 rollback;
 for links in (select db_link from v$dblink) loop

 DBMS_SESSION.CLOSE_DATABASE_LINK (links.db_link);
 end loop;
 end;