Oracle
 sql >> Database >  >> RDS >> Oracle

Come posso chiudere Oracle DbLinks in JDBC con origini dati e transazioni XA per evitare errori ORA-02020?

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];