2011-01-13 2 views
8

Я получаю следующее excpetion:SQLException: нарушение протокола. Oracle JDBC Driver вопрос

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). Я пробовал несколько разных тонких драйверов оракула, включая последнюю и ту, которая, похоже, точно соответствует версии оракула.

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

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

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

+0

Возможно, вы работаете из памяти на сервере БД? Правильно ли вы закрываете ресурсы на Java? Это происходит при первом запуске запроса в вашей серии или в одном из последующих? – Riggy

ответ

6

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

+2

Для меня исправлено обновление моего драйвера ojdbc. Я прыгнул до 11.2.0.2.0, и все было в порядке. – Muel

5

Для будущих гуглеров, которые имеют к этой странице, вот проблема, которую мы имели. Исключение нарушения протокола регистрировалось в журналах приложений и трассировке 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 plus работал отлично.

Первопричина

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

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

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

Решение

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

Исправлено из ds.setTestOnBorrow (false); - 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