SQLRecoverableException: исключение ввода-вывода: сброс соединения

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

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

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

6 ответов


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

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


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

java -Djava.security.egd=file:///dev/urandom [your command]

мы испытали эти ошибки периодически после обновления с 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 был в порядке. Проблема была решена путем добавления этого наш файл пользователя.

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

экспорт JAVA_OPTS= " $JAVA_OPTS-Djava.безопасность.egd=файл:/ / / dev / urandom "


Я хочу дать дополнительный ответ Начо Сориано'ы ...

недавно я искал, чтобы решить проблему, когда написанное приложение Java (работа Talend на самом деле) хочет подключиться к базе данных 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 connection необходимо несколько случайных чисел, чтобы принять хороший уровень безопасности. Linux генератор случайных чисел производят некоторые числа базы клавиатуры и мыши деятельности (среди других) и поместить их в стек. Дашь мне, на сервере, нет большое количество такой деятельности. Таким образом, может произойти, что программное обеспечение использует больше случайных чисел, чем генератор может произвести.

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

Решение 1-специфическое для одного решения приложения

решение дать добавить два параметра дано в JVM, пока начало:

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

Примечание: the '/.- важно, не урони его !

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

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

to

securerandom.source=file:/dev/urandom

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

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

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

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

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

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

в отношении

Томас


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

java -Джава.безопасность.egd=файл: / dev/../ dev / urandom [команда]

Ref : -https://community.oracle.com/thread/943911


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