SQLException: нарушение Протокола. Проблема с драйвером Oracle JDBC
Я получил следующее excpetion:
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)
система Oracle работает 10.2.0.3.0 на Solaris 5.10. Драйвер jdbc работает на JDK 1.6.0_21 (если это импорт, java также работает на машине Solaris 5.10). Я пробовал несколько разных драйверов oracle thin, включая последний и тот, который, как представляется, точно соответствует версии oracle.
запрос, который я запускаю, довольно прост: "выберите * из some_table порядка по key1, key2, key3", затем перебора результирующий набор и запись в файл. В таблице около 12 миллионов строк, поэтому я ожидаю, что процесс будет длительным, но, похоже, он умрет в течение 5-15 минут. Каждый раз, когда я запускаю его, он взрывается в другой строке, поэтому я не думаю, что проблема в данных.
Я нашел журнал предупреждений oracle, но я не мог сказать, что что-то там было связано с моим процессом. Тем не менее, я не эксперт по oracle, и, возможно, есть настройка oracle, на которую мне нужно посмотреть. Как ни странно , Я запускаю около пяти таких запросов (пара немного сложнее) на разных соединениях, и только два самых простых из них когда-либо получают эту проблему.
любая помощь или идеи о том, что посмотреть, чтобы сузить проблему будут оценены.
2 ответов
по-видимому, добавление -d64 в командную строку java устраняет эту проблему. Похоже на 64-разрядную проблему Solaris.
для будущих гуглеров, которые должны на этой странице, вот проблема, которую мы имели . Исключение нарушения протокола регистрировалось в журналах приложений и трассировке Oracle.
Oracle trace
Это ошибка из файлов трассировки oracle
- - - ОБНАРУЖЕНО НАРУШЕНИЕ ПРОТОКОЛА - - -
----- Dump Cursor sql_id=1j5kjnkncpp xsc=0x2a053a2a0 cur=0x2a052f1cf0 ---
----- Current SQL Statement for this session (sql_id=1jjns4k6npp) -----
select xyz
Из Журналов Приложений
Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000];
симптом
это исключение происходит иногда. В трассировке стека был другой sql, который был очень запутанным. Запуск sql с sql plus работал нормально.
Причины
исключение было вызвано, когда драйвер oracle пытался экспортировать данные CLOB. Это происходило только с несколькими записями, не со всеми. Данные в такой файл. Визуально мы не могли понять, что было не так с этими данными.
почему мы видели ошибки в журналах oracle ?
Итак, если это был дефект драйвера, почему мы увидели ошибку в трассировке oracle ? Логически ошибки драйвера должны быть ограничены только журналами приложений. Причина заключалась в том, что при нарушении протокола соединение было повреждено. Это соединение было возвращено в пул соединений. Любой пользователь или задание, когда будет использовать это соединение не будет работать и возникнет ошибка. Вот почему это произойдет в случайных местах, со случайными пользователи
решение
краткосрочным исправлением было изменение этого свойства в пуле соединений. Мы используем пул соединений DBCP.
изменен с ds.setTestOnBorrow (false); к ds.setTestOnBorrow (true);
теперь, когда пул возвращает поврежденное соединение с пулом , прежде чем приложение заимствует это соединение, оно проверит правильность. Если соединение непригодно, пул будет отброшен, а затем приложение получит новый / действительный соединение.
Если вы включаете журналы пула соединений, вы должны увидеть исключение, которое обычно проглатывается.
Обновить Драйвер
обновление до OJDBC 12.1.0.2 от OJDBC 12.1.0.1 решило проблему, даже для проблемных строк.
другие ссылки на ссылка