Elke gedistribueerde SQL, zelfs een select, opent een transactie die moet worden gesloten voordat u de databasekoppeling kunt sluiten. U moet ofwel terugdraaien of vastleggen voordat u ALTER SESSION CLOSE DATABASE LINK aanroept.
Maar het klinkt alsof je al iets anders hebt dat je transacties afhandelt. Als het niet mogelijk is om handmatig terug te draaien of vast te leggen, moet u proberen het aantal open links te verhogen. De OPEN_LINKS parameter is het maximum aantal links per sessie. Het aantal links dat je nodig hebt, is niet echt afhankelijk van de belasting, het moet gebaseerd zijn op het maximale aantal verschillende externe databases.
Bewerken:
De situatie die u in uw opmerking beschrijft, zou niet moeten gebeuren. Ik begrijp niet genoeg van uw systeem om te weten wat er werkelijk gebeurt met de transacties. Hoe dan ook, als je niet precies kunt achterhalen wat het systeem aan het doen is, kun je misschien "alter session close database link" vervangen door een procedure als deze:
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;
/
Je hebt deze beurs waarschijnlijk nodig:
grant select on v_$dblink to [relevant user];