Qualsiasi SQL distribuito, anche un select, aprirà una transazione che deve essere chiusa prima di poter chiudere il collegamento al database. Devi eseguire il rollback o il commit prima di chiamare ALTER SESSION CLOSE DATABASE LINK.
Ma sembra che tu abbia già qualcos'altro che gestisce le tue transazioni. Se non è possibile eseguire il rollback o il commit manualmente, dovresti provare ad aumentare il numero di collegamenti aperti. Il OPEN_LINKS parametro è il numero massimo di collegamenti per sessione. Il numero di collegamenti di cui hai bisogno non dipende realmente dal carico, dovrebbe essere basato sul numero massimo di database remoti distinti.
Modifica:
La situazione che descrivi nel tuo commento non dovrebbe accadere. Non capisco abbastanza del tuo sistema per sapere cosa sta realmente accadendo con le transazioni. Ad ogni modo, se non riesci a capire esattamente cosa sta facendo il sistema, puoi sostituire "alter session close database link" con una procedura come questa:
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;
/
Probabilmente avrai bisogno di questa sovvenzione:
grant select on v_$dblink to [relevant user];