Всеки разпределен SQL, дори избран, ще отвори транзакция, която трябва да бъде затворена, преди да можете да затворите връзката към базата данни. Трябва или да върнете назад, или да се ангажирате, преди да извикате ALTER SESSION CLOSE DATABASE LINK.
Но изглежда, че вече имате нещо друго, което обработва вашите транзакции. Ако не е възможно ръчно връщане назад или ангажиране, трябва да опитате да увеличите броя на отворените връзки. OPEN_LINKS параметърът е максималният брой връзки на сесия. Броят на връзките, от които се нуждаете, всъщност не зависи от натоварването, той трябва да се базира на максималния брой отделни отдалечени бази данни.
Редактиране:
Ситуацията, която описвате в коментара си, не трябва да се случва. Не разбирам достатъчно за вашата система, за да знам какво наистина се случва с транзакциите. Както и да е, ако не можете да разберете какво точно прави системата, може би можете да замените „промяна на връзката за затваряне на сесия към база данни“ с процедура като тази:
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
execute immediate 'alter session close database link '||links.db_link;
end loop;
end;
/
Вероятно ще ви е необходима тази субсидия:
grant select on v_$dblink to [relevant user];