SQLException: die Protokoll-Verletzung. Oracle-JDBC-Treiber Problem
Ich bin immer folgende Exception:
java.sql.SQLException: Protocol violation
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:190)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:286)
at oracle.jdbc.driver.T4C80all.receive(T4C80all.java:766)
at oracle.jdbc.driver.T4CPreparedStatement.do0all8(T4CPreparedStatement.java:216)
at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1225)
at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:373)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:284)
Dem Oracle-system ausgeführt wird 10.2.0.3.0 auf Solaris 5.10. Der jdbc-Treiber läuft auch auf JDK 1.6.0_21 (wenn es importieren der java ausgeführt wird, auf einem Solaris 5.10 Maschine auch). Ich habe versucht, mehrere verschiedene oracle-thin-Treiber, einschließlich der neuesten, und die, die angezeigt wird, exakt auf die oracle-version.
Die Abfrage, die bei mir läuft ist Recht einfach: "select * from some_table, um von key1, key2, key3" Dann die Iteration durch die Ergebnismenge und eine Datei schreiben. Der Tisch hat rund 12 Millionen Zeilen, so dass ich erwarte, dass der Prozess läuft lange, aber es scheint zu sterben innerhalb von 5-15 Minuten in es. Jedes mal, wenn ich es laufen lasse, es explodiert auf eine andere Zeile, so dass ich nicht denke, dass das problem mit den Daten.
Fand ich die oracle-alert-log, aber ich konnte nicht sagen, dass alles in es war in Bezug auf meinen Prozess. Trotzdem bin ich kein oracle-Experte, und vielleicht gibt es ein oracle-Einstellung, die ich sehen müssen. Seltsam genug, ich bin mit über fünf dieser Art von Abfragen (ein paar sind ein bisschen komplizierter) auf verschiedene verbindungen und nur zwei einfachsten jemals dieses problem.
Jede Hilfe oder Ideen, was zu betrachten, um das problem einzugrenzen würde geschätzt.
- Vielleicht sind Sie der Speicher auf dem DB-server? Sind Sie richtig schließen Sie die Ressourcen in Java? Dies geschieht auf der ersten Abfrage auszuführen, in der Reihe oder einer der späteren sein?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheinbar hinzufügen -d64 zu der java-Befehlszeile behebt dieses problem. Sieht aus wie ein Solaris 64-bit-Problem.
Für zukünftige Googler, die haben zu dieser Seite, hier ist das problem, das wir hatten .
Das Protokoll Zugriffsverletzung Ausnahme war angemeldet Anwendungsprotokolle und Oracle trace.
Oracle-trace -
Dies ist Fehler von oracle-trace-Dateien
- - - - PROTOKOLL-VERLETZUNG ERKANNT ---
Von Der Anwendung Protokolliert
Symptom
Diese Ausnahme war passiert gelegentlich. Der stack-trace sind verschiedene sql in denen es war sehr verwirrend. Ausführen von sql mit sql-plus funktioniert gut.
Ursache
Ausnahme wurde ausgelöst, wenn oracle-Treiber wurde versucht zu exportieren eines CLOB-Daten. Dies geschieht mit nur wenigen Datensätzen, die nicht alle von Ihnen. Die Daten als solche war Sie eine Datei. Visuell konnten wir nicht heraus, was falsch war, mit diesen Daten.
, Warum wir sehen Fehler in oracle-logs ?
Also, wenn dies war ein Treiber defekt, warum sehen wir die Fehler in oracle-trace ? Logisch die Fehler der Fahrer sollte nur beschränkt zur Anwendung protokolliert.
Grund war, dass wenn die Protokoll-Verletzung geschah, die Verbindung wurde beschädigt. Diese Verbindung an den Verbindungspool zurückgegeben. Jeder Benutzer oder jede Arbeit, wenn diese Verbindung nicht funktionieren würde, und erfahren würde-Fehler.
Das ist, warum es geschehen wird, an beliebigen Orten, mit zufälligen Benutzer
Lösung
Kurzfristig zu beheben war um diese Eigenschaft zu ändern, die in Verbindung mit pool. Wir sind mit DBCP connection pool.
Geändert
ds.setTestOnBorrow(false);
zu
ds.setTestOnBorrow(true);
Nun, wenn der pool gibt eine beschädigte Verbindung an den pool, bevor die app leiht diesem Zusammenhang , wäre es test für die Gültigkeit. Wenn die Verbindung ist unbrauchbar, pool abwerfen und dann app bekommt eine neue/gültige Verbindung.
Wenn Sie die Verbindung aktivieren-pool anmeldet, sollten Sie sehen, die Ausnahme, die normalerweise geschluckt wird.
Treiber Aktualisieren
Upgrade auf OJDBC 12.1.0.2 von OJDBC 12.1.0.1 das problem gelöst, auch für die problematischen Zeilen.
Einige andere links für Referenz
https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violation+caught+while+accessing+a+page+and+Oracle+DB+is+used