БД Oracle: java.sql.SQLException: закрытое соединение

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

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

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

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

2 ответа

Решение

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

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

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

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

pool.setValidateConnectionOnBorrow(true);

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

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

См. Документацию Oracle для получения более подробной информации.

Другие вопросы по тегам