SQLRecoverableException: I / O Exception: сброс соединения - PullRequest
14 голосов
/ 24 мая 2011

Вчера вечером я вышел из офиса с запущенной мной программой на Java. Он должен вставить много записей в базу данных нашей компании (Oracle), используя соединение JDBC. Этим утром, когда я вернулся на работу, я увидел эту ошибку (пойманную при попытке):

java.sql.SQLRecoverableException: I/O Exception: Connection reset

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

Есть идеи о том, что произошло и что я могу сделать, чтобы избежать этого?

Ответы [ 6 ]

23 голосов
/ 05 сентября 2016

Ошибка возникает в некоторых дистрибутивах RedHat.Единственное, что вам нужно сделать, это запустить приложение с параметром java.security.egd = file: /// dev / urandom :

java -Djava.security.egd=file:///dev/urandom [your command]
13 голосов
/ 24 мая 2011

Это просто означает, что что-то в бэкэнде (СУБД) решило перестать работать из-за недоступности ресурсов и т. Д. Это не имеет никакого отношения к вашему коду или количеству вставок.Вы можете прочитать больше о подобных проблемах здесь:

Это может не ответить на ваш вопрос, но вы получитеидея о том, почему это может происходить.Вы можете обсудить это со своим администратором базы данных и выяснить, есть ли что-то конкретное в вашем случае.

11 голосов
/ 11 апреля 2018

Я хочу получить дополнительный ответ решения nacho-soriano ...

Недавно я искал решение для проблемы, когда написано приложение Java (задание Talend ELT вфакт) хотите подключиться к базе данных Oracle (11g и более), затем случайно произойдет сбой.Операционная система RedHat Enterprise и CentOS.Задание выполняется очень быстро во времени (не более полминуты) и выполняется очень часто (приблизительно один запуск каждые 5 минут).

Иногда, в ночное время в качестве рабочего времени, во время интенсивной работы с базой данныхиспользование в качестве ленивого использования работы, одним словом случайно, соединение обрывается с этим сообщением:

Exception in component tOracleConnection_1
java.sql.SQLRecoverableException: Io exception: Connection reset
        at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:101)
        at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:458)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:465)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:208)
    and StackTrace follow ...

Объяснение проблемы:

Как подробно здесь

Для соединения Oracle требуются случайные числа, чтобы обеспечить хороший уровень безопасности.Генератор случайных чисел в Linux генерирует некоторые числа, основанные на активности клавиатуры и мыши (среди прочих), и помещает их в стек.Вы дадите мне, на сервере, нет большого количества такой деятельности.Таким образом, может случиться так, что программы используют больше случайных чисел, чем может произвести генератор.

Когда пул пуст, чтение из / dev / random будет блокироваться, пока не будет собран дополнительный шум окружающей среды.Время ожидания соединения Oracle падает (по умолчанию 60 секунд).

Решение 1 - Специально для одного приложения

Решение состоит в том, чтобы добавить два параметра, заданные JVM при запуске:

-Djava.security.egd=file:/dev/./urandom
-Dsecurerandom.source=file:/dev/./urandom

Примечание: «/ ./» важно, не бросайте его!

Таким образом, командная строка запуска может быть:

java -Djava.security.egd=file:/dev/./urandom -Dsecurerandom.source=file:/dev/./urandom -cp <classpath directives> appMainClass <app options and parameters>

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

Решение 2 - Общее решение Java JVM

Как объяснено здесь

Обе директивы, приведенные в решении 1, можно поместить в файл настроек безопасности Java.

Взгляните на $JAVA_HOME/jre/lib/security/java.security

Измените строку

securerandom.source=file:/dev/random

на

securerandom.source=file:/dev/urandom

Изменение вступает в силу немедленно для новых работающих приложений.

Что касается решения № 1, одним из недостатков этого решения является то, что сгенерированные числа немного менее безопасны как случайность влияет.На этот раз это глобальное влияние JVM.Что касается решения № 1, если вы не работаете в военной или секретной отрасли, это решение может быть вашим.

В идеале мы должны использовать «file: / dev /./ urandom» после Java 5, как и в предыдущемпуть снова будет указывать на /dev/random.

Сообщение об ошибке: https://bugs.openjdk.java.net/browse/JDK-6202721

Решение 3 - Аппаратное решение

Отказ от ответственности: I'mне связан ни с одним из поставщиков оборудования или продукта ...

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

Некоторая информация доступна здесь .

С уважением

Томас

5 голосов
/ 30 августа 2016

Решение
Измените настройку для вашего приложения, чтобы вы указали этот параметр [ -Djava.security.egd = file: / dev /../ dev / urandom ]рядом с командой java:

java -Djava.security.egd = файл: / dev /../ dev / urandom [ваша команда]

Ссылка: -https://community.oracle.com/thread/943911

4 голосов
/ 17 марта 2015

Мы периодически сталкивались с этими ошибками после обновления с 11g до 12c, и наша java была на 1.6.

Мы решили исправить java и jdbc с 6 до 7

export JAVA_HOME='/usr/java1.7'

export CLASSPATH=/u01/app/oracle/product/12.1.0/dbhome_1/jdbc/libojdbc7.jar:$CLASSPATH 

Несколько дней спустя все еще прерывистое соединение сбрасывается.

Мы закончили тем, что удалили все Java 7 выше.Java 6 была в порядке.Проблема была исправлена ​​путем добавления этого к нашему пользователю bash_profile.

Наши скрипты groovy, которые сталкивались с ошибкой, использовали / dev / random на нашем пакетном сервере VM.Ниже принудительно используется java и groovy для использования /dev/urandom.

export JAVA_OPTS = "$ JAVA_OPTS -Djava.security.egd = file: /// dev / urandom"

2 голосов
/ 24 мая 2011

Ваше исключение говорит все "Сброс соединения". Связь между вашим Java-процессом и сервером БД была потеряна, что могло произойти практически по любой причине (например, из-за проблем с сетью). SQLRecoverableException просто означает, что его можно восстановить, но основной причиной является сброс соединения.

...