Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SQLException:naruszenie protokołu. Problem ze sterownikiem Oracle JDBC

Dla przyszłych googlerzy, którzy mają dostęp do tej strony, mamy problem. Wyjątek naruszenia protokołu był rejestrowany w dziennikach aplikacji i śledzeniu Oracle.

Ślad Oracle

To jest błąd z plików śledzenia Oracle

--- WYKRYTO NARUSZENIE PROTOKOŁU ---

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

Z dzienników aplikacji

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

Objaw

Ten wyjątek zdarzał się sporadycznie. Ślad stosu miał w sobie inny sql, co było bardzo mylące. Uruchamianie sql z sql plus działało dobrze.

Przyczyna główna

Wyjątek został zgłoszony, gdy sterownik Oracle próbował wyeksportować dane CLOB. To działo się tylko z kilkoma płytami, nie wszystkimi. Dane jako takie były plikiem. Wizualnie nie mogliśmy stwierdzić, co jest nie tak z tymi danymi.

Dlaczego widzieliśmy błędy w dziennikach Oracle?

Więc jeśli była to usterka sterownika, dlaczego widzieliśmy błąd w Oracle trace? Logicznie rzecz biorąc, błędy sterownika powinny ograniczać się tylko do dzienników aplikacji. Powodem było to, że gdy doszło do naruszenia protokołu, połączenie zostało uszkodzone. To połączenie zostało zwrócone do puli połączeń. Każdy użytkownik lub zadanie, kiedy użyje tego połączenia, nie zadziała i wystąpi błąd. Dlatego będzie się to działo w losowych miejscach, z przypadkowymi użytkownikami

Rozwiązanie

Krótkoterminową poprawką była zmiana tej właściwości w puli połączeń. Używamy puli połączeń DBCP.

Zmieniono zds.setTestOnBorrow(false);tods.setTestOnBorrow(true);

Teraz, gdy pula zwraca uszkodzone połączenie do puli, zanim aplikacja pożyczy to połączenie , będzie testować poprawność. Jeśli połączenie jest bezużyteczne, pula zostanie odrzucona, a aplikacja otrzyma nowe/prawidłowe połączenie.

Jeśli włączysz dzienniki puli połączeń, powinieneś zobaczyć wyjątek, który zwykle jest połykany.

Aktualizacja sterownika

Uaktualnienie do OJDBC 12.1.0.2 z OJDBC 12.1.0.1 rozwiązało problem, nawet dla problematycznych wierszy.

Kilka innych linków w celach informacyjnych

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zamawiać według daty w PostgreSQL lub Oracle

  2. Oracle 11g — Jak zoptymalizować powolny wybór wstawiania równoległego?

  3. Jak wygenerować całe DDL schematu Oracle (skryptowalne)?

  4. Boże Narodzenie przychodzi wcześnie (Oracle 12.2)

  5. jak wybrać listę 10 000 unikalnych identyfikatorów z dual w Oracle SQL