Tout SQL distribué, même un select, ouvrira une transaction qui doit être fermée avant que vous puissiez fermer le lien de la base de données. Vous devez effectuer une restauration ou une validation avant d'appeler ALTER SESSION CLOSE DATABASE LINK.
Mais il semble que vous ayez déjà quelque chose d'autre qui gère vos transactions. S'il n'est pas possible de revenir en arrière ou de valider manuellement, vous devez essayer d'augmenter le nombre de liens ouverts. Les OPEN_LINKS Le paramètre est le nombre maximum de liens par session. Le nombre de liens dont vous avez besoin ne dépend pas vraiment de la charge, il doit être basé sur le nombre maximum de bases de données distantes distinctes.
Modifier :
La situation que vous décrivez dans votre commentaire ne devrait pas se produire. Je ne comprends pas assez votre système pour savoir ce qui se passe réellement avec les transactions. Quoi qu'il en soit, si vous ne pouvez pas comprendre exactement ce que fait le système, vous pouvez peut-être remplacer "alter session close database link" par une procédure comme celle-ci :
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;
/
Vous aurez probablement besoin de cette subvention :
grant select on v_$dblink to [relevant user];