SQLException: нарушение протокола в Oracle

Я получаю «Нарушение протокола». У меня есть приложение, работающее на RedHat Linux. База данных и приложение находятся на одном компьютере.

Используемая версия Oracle: Oracle 11g R2 (11.2.0.3.0)
Используемый драйвер JDBC: 12.1.0.1
Используемая Java: jdk1.7.0.65 32-разрядная версия

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

Кроме того, это нарушение протокола также может возникнуть при достижении максимального количества подключений к БД?

Сообщение об ошибке:

java.sql.SQLException: нарушение протокола: [72] в oracle.jdbc.driver.T4CTTIfun.receive (T4CTTIfun.java:464) в oracle.jdbc.driver.T4CTTIfun.doRPC (T4CTTIfun.java:192) в oracle.jdb .driver.T4C8Oall.doOALL (T4C8Oall.java:531) в oracle.jdbc.driver.T4CPreparedStatement.doOall8 (T4CPreparedStatement.java:207) в oracle.jdbc.driver.T4CPreparedStatement4escrib.execcribe. jdbc.driver.OracleStatement.executeMaybeDescribe (OracleStatement.java:1167) в oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java:1289) в oracle.jdbc.driver.OraclePreparedStatement.exe .jdbc.driver.OraclePreparedStatement.executeQuery (OraclePreparedStatement.java:3628) в oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery (OraclePreparedStatementWrapper.ja va: 1493)


person Saurav    schedule 31.03.2015    source источник
comment
это потому, что срок действия вашего пароля пользователя истек?   -  person kucing_terbang    schedule 31.03.2015
comment
@kucing_terbang Нет, срок действия пароля пользователя не истек.   -  person Saurav    schedule 31.03.2015
comment
Нам нужно будет увидеть полное сообщение об ошибке, а не просто ее краткое изложение.   -  person skaffman    schedule 01.04.2015
comment
stackoverflow.com / questions / 4685021 /   -  person vsingh    schedule 17.02.2016


Ответы (7)


Увеличьте размер кучи!

У меня эта точная ошибка появлялась случайным образом.

Приложению не хватало памяти, и ошибка OutOfMemory была потеряна из-за логики в коде, которая привела к возникновению несвязанного исключения.

Одна из причин, по которой приложения не должны обрабатывать выбросы и ошибки.

person Tian Na    schedule 26.08.2016
comment
Была такая же проблема. Инструмент мониторинга значительно помогает при таких ошибках ... - person gavenkoa; 13.06.2017

Такая ошибка указывает на ошибку в тонком драйвере JDBC, который не может понять, что сервер возвращает по сети (сокету).

Вы всегда можете попробовать использовать самую последнюю версию тонкого драйвера JDBC, надеясь, что ошибка будет решена. На сегодняшний день последняя версия - 12.1.0.2.

Если это не поможет, вам нужно будет обратиться в службу поддержки Oracle. Первое, что вас попросят, это предоставить sqlnet-трассировку соединения, в котором произошла эта ошибка. Это поможет инженерам Oracle понять, что происходило в сети, когда произошел сбой.

Чтобы включить трассировку sqlnet, отредактируйте файл sqlnet.ora на сервере и добавьте

TRACE_LEVEL_SERVER = 16

который добавит файл трассировки для каждого соединения в вашем директоре трассировки (на сервере). Не делайте этого в производственной системе, потому что это резко замедлит работу системы и создаст огромное количество трассировок.

Удачи.

person Jean de Lavarene    schedule 21.04.2015

В моем случае использование getGeneratedKeys () из PreparedStatement для получения текущего значения последовательности вызывало исключения нарушения протокола. Заменив его на получение текущего значения последовательности из последовательности, как показано ниже:

String curSeqValQuery = "SELECT seq_name.CURRVAL FROM DUAL";
...
statement = con.prepareStatement(curSeqValQuery);
resultSet = (OracleResultSet) statement.executeQuery();
...

решил проблему.

person AVA    schedule 26.08.2016

Проблема исправлена ​​в ojdbc7.jar - версия 12.1.0.2 (версию вы можете проверить в META-INF-файле jar)

person Santhosh Aella    schedule 04.10.2018
comment
Это действительно, если вы используете clob: stackoverflow .com / questions / 22785120 / - person Hasnaa Ibraheem; 05.02.2021

Обычно это указывает на поврежденный трафик TCP / IP. Это может быть из-за введенного трафика или отброшенных пакетов. Выполните ifconfig, чтобы увидеть, не влияет ли на какой-либо из ваших сетевых интерфейсов необычно большое количество отброшенных пакетов. Чтобы избежать проблем, когда вы указываете, что база данных и программа Java работают на одном компьютере, попробуйте использовать интерфейс обратной петли 127.0.0.1 (localhost), а не внешний IP-адрес для подключения к базе данных или наоборот, только для тест.

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

person YoYo    schedule 27.08.2018

Возможно, соединение просто заражено или недействительно. Если ваше соединение JDBC происходит из пула соединений, всегда проверяйте соединение при резервировании.

person Pierluigi Vernetto    schedule 04.03.2016

В моем случае это произошло, когда мы пытались извлечь данные с помощью драйвера ojdbc, нацеленного на ссылку db из другого источника данных, мы не подключались к прямому источнику данных. Как только мы подключились через прямое соединение вместо использования ссылки db, проблема перестала появляться.
Еще я заметил, что проблема возникала постоянно, когда мы пытались извлечь данные из столбца с китайскими / японскими символами.
Наконец, извлечение данных по частям тоже было подходящим решением.
HTH

person Hasnaa Ibraheem    schedule 05.02.2021