БД Oracle: java.sql.SQLException: закрытое соединение - PullRequest
32 голосов
/ 22 июля 2011

Причины java.sql.SQLException: закрытое соединение с Oracle ??

java.sql.SQLException: закрытое соединение на oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:112) в oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:146) в oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:208) в oracle.jdbc.driver.PhysicalConnection.comj1131) в oracle.jdbc.OracleConnectionWrapper.commit (OracleConnectionWrapper.java:117)

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

AbandonedConnectionTimeout установлен в 15 минут InactivityTimeout установлен в 30 минут

Ответы [ 2 ]

43 голосов
/ 22 июля 2011

Это означает, что в какой-то момент соединение было успешно установлено, но когда вы попытались зафиксировать его, соединение больше не было открыто. Упомянутые вами параметры звучат как настройки пула подключений. Если так, то они не связаны с этой проблемой. Наиболее вероятной причиной является межсетевой экран между вами и базой данных, который уничтожает соединения после определенного периода простоя. Наиболее распространенное исправление - заставить ваш пул соединений выполнять запрос проверки, когда соединение извлекается из него. Это немедленно идентифицирует и устраняет мертвые соединения, гарантируя, что вы получаете только хорошие соединения из пула.

9 голосов
/ 22 октября 2013

Вы должны проверить соединение.

Если вы используете Oracle, вполне вероятно, что вы используете Универсальный пул соединений Oracle . Следующее предполагает, что вы делаете это.

Самый простой способ проверить соединение - это сообщить Oracle, что соединение должно быть проверено при его заимствовании. Это можно сделать с помощью

pool.setValidateConnectionOnBorrow(true);

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

if (connection == null || !((ValidConnection) connection).isValid())

Подробнее см. В документации Oracle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...