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

SQLException:Protokollverletzung. Problem mit dem Oracle JDBC-Treiber

Für zukünftige Googler, die diese Seite besuchen müssen, ist hier das Problem, das wir hatten. Die Protokollverletzungsausnahme wurde in Anwendungsprotokollen und Oracle-Trace protokolliert.

Oracle-Trace

Dies ist ein Fehler von Oracle-Trace-Dateien

--- PROTOKOLLVERLETZUNG ERKANNT ---

----- Dump Cursor sql_id=1j5kjnkncpp xsc=0x2a053a2a0 cur=0x2a052f1cf0 ---
----- Current SQL Statement for this session (sql_id=1jjns4k6npp) -----
        select xyz

Aus Anwendungsprotokollen

Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000];

Symptom

Diese Ausnahme trat gelegentlich auf. Der Stack-Trace enthielt unterschiedliche SQL, was sehr verwirrend war. Das Ausführen von SQL mit SQL Plus funktionierte einwandfrei.

Grundursache

Die Ausnahme wurde ausgelöst, als der Oracle-Treiber versuchte, CLOB-Daten zu exportieren. Dies geschah nur bei wenigen Datensätzen, nicht bei allen. Die Daten als solche waren eine Datei. Visuell konnten wir nicht erkennen, was mit diesen Daten nicht stimmte.

Warum haben wir Fehler in Oracle-Protokollen gesehen?

Wenn dies also ein Treiberdefekt war, warum haben wir den Fehler in Oracle Trace gesehen? Logischerweise sollten sich die Treiberfehler nur auf Anwendungsprotokolle beschränken. Der Grund dafür war, 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, würde nicht funktionieren und es würde ein Fehler auftreten. Deshalb wird es an zufälligen Orten mit zufälligen Benutzern passieren

Lösung

Eine kurzfristige Lösung bestand darin, diese Eigenschaft im Verbindungspool zu ändern. Wir verwenden den DBCP-Verbindungspool.

Geändert vonds.setTestOnBorrow(false);tods.setTestOnBorrow(true);

Wenn der Pool nun eine beschädigte Verbindung an den Pool zurückgibt, wird die Gültigkeit geprüft, bevor die App diese Verbindung ausleiht. Wenn die Verbindung unbrauchbar ist, wird der Pool verworfen und die App erhält eine neue/gültige Verbindung.

Wenn Sie Verbindungspoolprotokolle aktivieren, sollten Sie die Ausnahme sehen, die normalerweise verschluckt wird.

Treiber-Upgrade

Das Upgrade auf OJDBC 12.1.0.2 von OJDBC 12.1.0.1 löste das Problem, sogar für die problematischen Zeilen.

Einige andere Referenzlinks

https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violation+caught+while+accessing+a+page+and+Oracle+DB+is+used