SQLException: нарушение протокола. Проблема с драйвером Oracle JDBC - PullRequest
8 голосов
/ 13 января 2011

Я получаю следующее исключение:

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 работает на Solaris 5.10 10.2.0.3.0.Драйвер jdbc работает на JDK 1.6.0_21 (при импорте java работает и на машине Solaris 5.10).Я перепробовал несколько различных тонких драйверов Oracle, включая самый последний и тот, который, кажется, точно соответствует версии Oracle.

Запрос, который я выполняю, довольно прост: "выберите * из порядка some_table по key1, key2, key3 "Затем итерация набора результатов и запись в файл.Таблица содержит около 12 миллионов строк, поэтому я ожидаю, что процесс выполняется долго, но, похоже, он умирает через 5-15 минут.Каждый раз, когда я запускаю его, он взрывается в другой строке, поэтому я не думаю, что проблема с данными.

Я нашел журнал оповещений оракула, но не мог сказать, что что-то там былосвязанные с моим процессом.Тем не менее, я не эксперт по оракулам и, возможно, мне нужно взглянуть на обстановку оракула.Как ни странно, я выполняю около пяти таких запросов (пара немного более сложная) на разных соединениях, и только два самых простых когда-либо сталкиваются с этой проблемой.

Любая помощь или идеи о том, что искатьЧтобы сузить проблему, мы будем признательны.

Ответы [ 2 ]

6 голосов
/ 11 февраля 2016

Для будущих гуглеров, которым нужна эта страница, вот проблема, с которой мы столкнулись.Исключение нарушения протокола регистрируется в журналах приложений и трассировке Oracle.

Трассировка 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 работало нормально.

Root Cause

Исключение было выдано, когда драйвер oracle пытался экспортировать данные CLOB.Это происходило с несколькими записями, но не со всеми.Данные как таковые были файлом.Визуально мы не могли разобрать, что не так с этими данными.

Почему мы видели ошибки в журналах оракула?

Так что, если это был дефект драйвера, почемумы видим ошибку в oracle trace?Логически ошибки драйвера должны быть ограничены только журналами приложений.Причины были в том, что при нарушении протокола соединение было повреждено.Это соединение было возвращено в пул соединений.Любой пользователь или работа, которая будет использовать это соединение, не будет работать и будет иметь ошибку.Вот почему это произойдет в случайных местах со случайными пользователями

Решение

Кратковременное исправление состояло в изменении этого свойства в пуле соединений.Мы используем пул соединений DBCP.

Изменено в ds.setTestOnBorrow (false);to ds.setTestOnBorrow (true);

Теперь, когда пул возвращает поврежденное соединение с пулом, прежде чем приложение заимствует это соединение, оно будет проверяться на достоверность.Если соединение непригодно для использования, пул откажется, а затем приложение получит новое / действительное соединение.

Если вы включите журналы пула соединений, вы должны увидеть исключение, которое обычно проглатывается.Обновление драйвера

Обновление до OJDBC 12.1.0.2 с OJDBC 12.1.0.1 решило проблему даже для проблемных строк.

Некоторые другие ссылки для справки

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

6 голосов
/ 17 февраля 2011

Очевидно, добавление -d64 в командную строку java решает эту проблему.Похоже на 64-разрядную версию Solaris.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...