Ich erhalte die folgende Bemerkung:
%Vor%Das Oracle-System läuft unter Solaris 5.10 mit 10.2.0.3.0. Der jdbc-Treiber läuft unter JDK 1.6.0_21 (wenn der Import erfolgt, läuft der Java-Rechner auch auf einem Solaris 5.10-Rechner). Ich habe mehrere verschiedene Orakel-Thin-Treiber ausprobiert, einschließlich der neuesten und der, die genau der Oracle-Version zu entsprechen scheint.
Die Abfrage, die ich ausführe, ist recht einfach: "wähle * aus der Reihenfolge some_table nach key1, key2, key3" Dann wiederhole ich die Ergebnismenge und schreibe in eine Datei. Der Tisch hat ungefähr 12 Millionen Reihen, also erwarte ich, dass der Prozess lange läuft, aber er scheint innerhalb von 5-15 Minuten zu sterben. Jedes Mal, wenn ich es ausführe, explodiert es in einer anderen Reihe, also glaube ich nicht, dass das Problem mit den Daten zusammenhängt.
Ich habe das Orakel-Alarmprotokoll gefunden, aber ich konnte nicht feststellen, dass irgendetwas darin mit meinem Prozess zusammenhing. Trotzdem bin ich kein Orakelexperte und vielleicht gibt es ein Orakel-Setting, das ich mir ansehen muss. Seltsamerweise laufe ich etwa fünf dieser Art von Abfragen (ein paar sind ein bisschen komplizierter) auf verschiedenen Verbindungen und nur zwei einfachste haben jemals dieses Problem.
Jede Hilfe oder Ideen, was zu betrachten ist, um das Problem einzugrenzen, würde geschätzt werden.
Für zukünftige Googler, die auf dieser Seite sind, ist hier das Problem, das wir hatten. Die Protokollverletzungsausnahme wurde in Anwendungsprotokollen und Oracle-Trace protokolliert.
Oracle-Ablaufverfolgung
Dies ist ein Fehler von Oracle Trace-Dateien
--- PROTOKOLLVERSTÖSSE ERKANNT ---
%Vor%Aus Anwendungsprotokollen
%Vor%Symptom
Diese Ausnahme trat gelegentlich auf. Der Stack-Trace hatte unterschiedliche SQL-Werte, was sehr verwirrend war. Das Ausführen der SQL mit SQL Plus funktioniert gut.
Grundursache
Die Ausnahme wurde ausgelöst, als der Oracle-Treiber versuchte, CLOB-Daten zu exportieren. Dies geschah mit nur wenigen Aufzeichnungen, nicht alle. Die Daten als solche waren eine Datei. Visuell konnten wir nicht erkennen, was mit diesen Daten falsch war.
Warum wurden Fehler in Oracle-Protokollen angezeigt?
Also, wenn das ein Treiberfehler war, warum haben wir den Fehler in Orakel-Trace gesehen? Logischerweise sollten die Treiberfehler nur auf Anwendungsprotokolle beschränkt sein. Die Gründe dafür waren, dass bei einer Protokollverletzung die Verbindung beschädigt wurde. Diese Verbindung wurde an den Verbindungspool zurückgegeben. Jeder Benutzer oder Job, der diese Verbindung verwendet, funktioniert nicht und es treten Fehler auf. Deshalb wird es an zufälligen Orten passieren, mit zufälligen Benutzern
Lösung
Eine kurzfristige Lösung bestand darin, diese Eigenschaft im Verbindungspool zu ändern. Wir verwenden den DBCP-Verbindungspool.
geändert von ds.setTestOnBorrow (false); zu ds.setTestOnBorrow (true);
Wenn der Pool nun eine beschädigte Verbindung zum Pool zurückgibt, bevor die App diese Verbindung ausborgt, würde sie auf Gültigkeit prüfen. Wenn die Verbindung nicht genutzt werden kann, wird der Pool gelöscht und die App erhält eine neue / gültige Verbindung.
Wenn Sie Protokolle für Verbindungspools aktivieren, sollten Sie die Ausnahme sehen, die normalerweise verschluckt wird.
Treiber-Upgrade
Upgrade auf OJDBC 12.1.0.2 von OJDBC 12.1.0.1 löste das Problem, selbst für die problematischen Zeilen.
Einige andere Links als Referenz