java.sql.SQLException: Io исключения: сломанный канал, как восстановить без перезагрузки? - PullRequest
7 голосов
/ 19 марта 2012

В моем приложении я использую соединение с Oracle, когда соединение потеряно и я пытаюсь повторно подключиться, я получаю исключение:

java.sql.SQLException: Io exception: Broken pipe
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:161)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:273)
    at oracle.jdbc.driver.T4CStatement.fetch(T4CStatement.java:540)
    at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:264)
    at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:196)

Для восстановления мне нужно перезапустить приложение, возможно ли восстановление без перезапуска?Спасибо.

1 Ответ

3 голосов
/ 19 марта 2012

Следующие могут быть возможности, которые могут быть причиной исключения:

  1. Проблема с сетью. Это сеть между базой данных и сервером приложений, из-за которой через некоторое время физическое соединение прерывается. Вероятно, это происходит из-за межсетевого экрана, работающего за сетью, который настроен на уничтожение соединений БД через определенный промежуток времени. Вы можете обойти эту проблему, чтобы поддерживать соединение постоянно, просто переконфигурировав сервер приложений. Для Tomcat вы можете попробовать добавить validationQuery="select 'validationQuery' from dua l в файл конфигурации источника данных Tomcat (context.xml)

  2. Соединения с сервером базы данных сбрасываются, и клиент не уведомляется драйвером базы данных. Проблема в этом случае заключается в том, что драйвер Oracle обнаруживает, что его сокет для СУБД каким-то образом (опять-таки, брандмауэр?) Был закрыт другим концом. В качестве решения вы можете подумать о том, чтобы установить тайм-аут соединения (в пуле) короче, чем тайм-аут сервера сети / БД.

...