sql >> Databasteknik >  >> RDS >> Oracle

Hur kan jag stänga Oracle DbLinks i JDBC med XA-datakällor och transaktioner för att undvika ORA-02020-fel?

All distribuerad SQL, även en utvald, öppnar en transaktion som måste stängas innan du kan stänga databaslänken. Du måste antingen återställa eller commit innan du ringer ALTER SESSION CLOSE DATABASE LINK.

Men det låter som att du redan har något annat som hanterar dina transaktioner. Om det inte är möjligt att manuellt återställa eller commit, bör du försöka öka antalet öppna länkar. OPEN_LINKS parametern är det maximala antalet länkar per session. Antalet länkar du behöver beror inte riktigt på belastningen, det bör baseras på det maximala antalet distinkta fjärrdatabaser.

Redigera:

Situationen du beskriver i din kommentar borde inte hända. Jag förstår inte tillräckligt mycket om ditt system för att veta vad som verkligen händer med transaktionerna. Hur som helst, om du inte kan ta reda på exakt vad systemet gör kanske du kan ersätta "ändra session stäng databas länk" med en procedur som denna:

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

Du kommer förmodligen att behöva det här bidraget:

grant select on v_$dblink to [relevant user];



  1. Jämför två MySQL-databaser

  2. Postgres/JSON - uppdatera alla arrayelement

  3. WHERE IN (uppsättning av ID)

  4. Generera datumintervall från två datumkolumner