2011-01-13 12 views
8

Dostaję następujący excpetion:Wyjątek SQLException: naruszenie protokołu. Oracle JDBC kwestia sterowników

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) 

System Oracle pracuje 10.2.0.3.0 Solaris 5.10. Sterownik jdbc działa w JDK 1.6.0_21 (jeśli jest importowany, java działa również na komputerze z systemem Solaris 5.10). Wypróbowałem kilka różnych rzadkich sterowników, w tym najnowsze i te, które wydają się dokładnie pasować do wersji Oracle.

Zapytanie, które mam uruchomione, jest dość proste: "wybierz * z some_table order by key1, key2, key3" Następnie przejrzyj zestaw wyników i zapisz do pliku. Tabela ma około 12 milionów wierszy, więc spodziewam się, że proces trwa długo, ale zdaje się, że umiera w ciągu 5-15 minut. Za każdym razem, gdy go uruchamiam, wieje w innym rzędzie, więc nie sądzę, że problem dotyczy danych.

Znalazłem dziennik alarmów oracle, ale nie mogłem powiedzieć, że coś tam było związane z moim procesem. Wciąż nie jestem ekspertem od oracle i być może jest to ustawienie, na które muszę spojrzeć. O dziwo, mam około pięciu takich zapytań (kilka jest nieco bardziej skomplikowanych) na różnych połączeniach, a tylko dwa najprostsze z nich mają ten problem.

Każda pomoc lub pomysł na co zwrócić uwagę, aby zawęzić problem, byłby doceniony.

+0

Być może są na wyczerpaniu pamięci na serwerze DB? Czy prawidłowo zamykasz zasoby w Javie? Czy dzieje się to przy pierwszym zapytaniu uruchamianym w Twojej serii lub w jednym z późniejszych? – Riggy

Odpowiedz

6

Podobno dodanie -d64 do wiersza poleceń java rozwiązuje ten problem. Wygląda na 64-bitowy problem Solaris.

+2

Dla mnie uaktualnienie mojego sterownika ojdbc naprawiło to. Skoczyłem do 11.2.0.2.0 i wszystko było w porządku. – Muel

5

Dla przyszłych pracowników Google, którzy mają tę stronę, tutaj jest problem, który mieliśmy. Wyjątek naruszenia protokołu był rejestrowany w dziennikach aplikacji i śledzeniu Oracle.

Oracle ślad

Jest to błąd z plików śledzenia oracle

--- PROTOKÓŁ WYKRYCIU NARUSZENIE ---

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

z zastosowania Logi

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

Objaw

Ten wyjątek miał miejsce sporadycznie. Ślad stosu zawierał różne sql, co było bardzo mylące. Uruchomienie sql z sql plus działało dobrze.

głównej Przyczyna

Wyjątek został wyrzucony, gdy kierowca Oracle próbuje wyeksportować dane CLOB. Tak działo się tylko z kilkoma zapisami, nie wszystkimi. Dane jako takie były plikiem. Wizualnie nie mogliśmy stwierdzić, co jest nie tak z tymi danymi.

Dlaczego widzimy błędy w dziennikach Oracle?

Więc jeśli to była usterka kierowcy, dlaczego widzieliśmy błąd w śladzie Oracle? Logicznie błędy sterownika powinny ograniczać się tylko do dzienników aplikacji. Powodem było to, że po wystąpieniu naruszenia protokołu połączenie uległo uszkodzeniu.To połączenie zostało zwrócone do puli połączeń. Dowolny użytkownik lub zadanie, które wykorzysta to połączenie, nie będzie działać i wystąpi błąd. Dlatego stanie się to w losowych miejscach, z przypadkowych użytkowników

Rozwiązanie

Krótki termin fix było zmienić tę właściwość w puli połączeń. Korzystamy z puli połączeń DBCP.

Zmiana z ds.setTestOnBorrow (fałsz); do ds.setTestOnBorrow (true);

Teraz, gdy pula zwróci uszkodzone połączenie z pulą, zanim aplikacja zapożyczy to połączenie, przetestuje ważność. Jeśli połączenie nie nadaje się do użytku, pula zostanie odrzucona, a następnie aplikacja otrzyma nowe/poprawne połączenie.

Jeśli włączysz dzienniki pul połączeń, powinieneś zobaczyć wyjątek, który normalnie jest połknięty.

Kierowca Upgrade

Upgrade do OJDBC 12.1.0.2 z OJDBC 12.1.0.1 rozwiązać problem, nawet na problematycznych wierszy.

Niektóre inne linki odsyłające

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

Powiązane problemy