Frage

In unserer server - /client-setup, die wir erleben einige seltsame Verhalten.Der client ist in C/C++-Anwendung, die OCI-Verbindung zu einem Oracle-server (unter Verwendung der OTL Bibliothek).

Jedes jetzt und dann der DB-server stirbt in einer Art und Weise (ja, das ist der Kern, aber von der Applikations-Seite sind wir nicht in der Lage, es zu lösen, sondern haben zu deal mit es sowieso), dass die Maschine reagiert nicht mehr auf neue Anforderungen/ - verbindungen, sondern die bereits bestehenden, wie die Oracle-verbindungen, nicht fallen lassen oder time-out.Anfragen an die DB einfach nie erfolgreich zurück mehr.

Welche Möglichkeiten (wenn überhaupt) von Oracle zu erkennen, diese ins stocken geraten-verbindungen von den client-Applikation seitlich und erholen Sie sich in einem mehr oder weniger sicheren Weg?

War es hilfreich?

Lösung

Dies ist ein bug in Oracle ( oder rufen Sie eine Funktion ), bis 11.1.0.6 und Sie sagten, dass der patch auf Oracle 11g release 1 ( patch 11.1.0.7 ), das das beheben kann.Brauchen, um zu sehen, dass.Wenn es passiert, haben Sie auf Abbrechen ( kill ), die der thread ausführen dieser Aktion.Kein guter Ansatz, wenn

Andere Tipps

In meinem DB-schema habe ich eine Tabelle mit einer konstant aufzeichnen.Nur poll solche Tabelle in regelmäßigen Abständen durch einfache SQL-Anfrage.Alle anderen Methoden unzuverlässig.

Es gibt eine set_timeout API in OTL, die nützlich sein könnten für diese.

Edit:Eigentlich ignorieren. set_timeout funktioniert nicht mit OCI.Haben Sie einen Blick auf die set_timeout Beschreibung hier wo es beschreibt eine Technik, die verwendet werden können, mit OCI

Klingt wie Sie brauchen, um das Feuer aus eine Abfrage an die Datenbank (z.B. SELECT * FROM dual;), dann, wenn die Datenbank noch nicht geantwortet innerhalb einer festgelegten Zeitspanne wird der server ist gestorben und entsprechend reagieren.Ich fürchte, ich weiß nicht, C/C++, aber Sie können verwenden Sie multi-threading, das Feuer aus der Erklärung, dann warten Sie für die Antwort, ohne das Aufhängen der Anwendung?

Das funktioniert - ich habe genau das gemacht, was Sie suchen.Eltern-Prozess (A) erstellen Sie einen untergeordneten Prozess (B).Der untergeordnete Prozess (B) eine Verbindung zur Datenbank herstellt, führt eine Abfrage (etwas wie "select 1 from a_table" - Sie erhalten eine bessere Leistung, wenn Sie vermeiden Sie die Verwendung von "dual" für diese und erstellen Sie Ihre eigene Tabelle).Wenn (B) eine erfolgreich ist, dann schreibt er heraus, dass es erfolgreich war und beendet.(A) wartet eine bestimmte Zeit.Ich benutzte 15 Sekunden.Wenn (A) erkennt, dass (B) noch läuft - dann kann er davon ausgehen, dass die Datenbank gesperrt ist - es Tötet (B) und ergreift die notwendigen Maßnahmen (Wie ruft mich am Telefon mit einer SMS).

Wenn Sie das konfigurieren der SQL*NET-verwenden Sie eine timeout-Sie werden wahrscheinlich feststellen, dass große Abfragen wird daran scheitern.Die OCI set_timeout Konfiguration wird auch verursachen diese.

Es gibt eine manuelle Möglichkeit, dies zu vermeiden.Sie können öffnen Sie eine firewall und etwas tun, wie ping-Datenbank nach jeder angegebenen Zeit.Auf diese Weise wird die Datenbank-Verbindung wird nicht verloren gehen.

Idee

If (current_time - lastPingTime > configuredPingTime)
{
     //Dummy query
     select 1 from dual;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top