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