Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORACLE/ASP.NET:ORA-2020 - Zu viele Datenbankverknüpfungen ... was verursacht das?

Zuerst die einfache Lösung:Ich würde doppelt überprüfen, ob in der Produktionsdatenbank die Anzahl der Standardlinks tatsächlich ist 4.

select *
  from v$system_parameter
 where name = 'OPEN_LINKS'

Vorausgesetzt, Sie kommen nicht so leicht davon:

Sie sagen, dass Sie die Sitzung explizit schließen, was gemäß die Dokumentation , sollte bedeuten, dass alle dieser Sitzung zugeordneten Links geschlossen sind. Ansonsten bekenne ich mich in diesem Punkt zu völliger Unwissenheit.

Mir fallen da keine Nachteile ein. Tom Kyte schlägt vor , wenn auch schon vor langer Zeit, dass jeder offene Datenbanklink 500k PGA-Speicher verbraucht. Wenn Sie keine haben, wird dies natürlich ein Problem verursachen, aber es sollte für die meisten Situationen mehr als in Ordnung sein.

Es gibt jedoch unbeabsichtigte Konsequenzen:Stellen Sie sich vor, Sie erhöhen diese Zahl auf 100. Jemand codiert etwas, das ständig Links öffnet und viele Daten durch alle zieht select * from my_massive_table oder ähnliches. Anstelle von 4 Sitzungen, die dies tun, haben Sie 100, die versuchen, Hunderte von Gigabyte gleichzeitig zu übertragen. Ihr Netzwerk stirbt unter der Belastung...

Es gibt wahrscheinlich noch mehr, aber Sie bekommen ein Bild.

Wie Sie bemerkt haben, ist die beste Antwort "wahrscheinlich nicht", was nicht viel hilft. Sie erwähnen nicht genau, wie Sie die Sitzung beenden, aber wenn Sie sie beenden, anstatt sie ordnungsgemäß zu schließen, dann auf jeden Fall.

Die Verwendung eines Datenbanklinks erzeugt einen untergeordneten Prozess auf dem Remote-Server. Da Ihr Server nicht länger die absolute Verantwortung für diesen Prozess trägt, gibt es unzählige Dinge, die dazu führen können, dass er verwaist oder anderweitig nicht geschlossen wird, wenn der übergeordnete Prozess beendet wird. Das passiert auf keinen Fall ständig, aber es kann und kommt vor.

Ich würde zwei Dinge tun.

  1. Wenn in Ihrem Prozess eine Ausnahme auftritt, senden Sie die Ergebnisse der folgenden Abfrage per E-Mail an sich selbst.

    select * 
      from v$dblink
    

    Zumindest wissen Sie, welche Datenbank-Links in der Sitzung geöffnet sind, und geben Ihnen eine Möglichkeit, sie zu verfolgen.

  2. Befolgen Sie die Hinweise zur Dokumentation; insbesondere Folgendes:

    "Möglicherweise haben Sie Gelegenheit, den Link manuell zu schließen. Schließen Sie Links beispielsweise, wenn:

    • Die durch einen Link hergestellte Netzwerkverbindung wird selten in einer Anwendung verwendet.
    • Die Benutzersitzung muss beendet werden."

Das erste scheint genau auf Ihre Situation zu passen. Wenn Ihr Prozess nicht zeitkritisch ist, was nicht der Fall zu sein scheint, was haben Sie dann zu verlieren? Die Syntax lautet:

alter session close database link <linkname>