Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como posso fechar Oracle DbLinks em JDBC com fontes de dados e transações XA para evitar erros ORA-02020?


Qualquer SQL distribuído, mesmo um select, abrirá uma transação que deve ser fechada antes que você possa fechar o link do banco de dados. Você precisa reverter ou confirmar antes de chamar ALTER SESSION CLOSE DATABASE LINK.

Mas parece que você já tem outra coisa lidando com suas transações. Se não for possível reverter ou confirmar manualmente, você deve tentar aumentar o número de links abertos. O OPEN_LINKS parâmetro é o número máximo de links por sessão. O número de links que você precisa não depende realmente da carga, deve ser baseado no número máximo de bancos de dados remotos distintos.

Editar:

A situação que você descreve em seu comentário não deveria acontecer. Não entendo o suficiente sobre seu sistema para saber o que realmente está acontecendo com as transações. De qualquer forma, se você não consegue descobrir exatamente o que o sistema está fazendo, talvez você possa substituir "alter session close database link" por um procedimento como este:
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;
/

Você provavelmente precisará desta concessão:
grant select on v_$dblink to [relevant user];