Подтвердить что ты не робот

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

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

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

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

AbandonedConnectionTimeout установлен на 15 минут НеактивностьTimeout установлена ​​на 30 минут

4b9b3361

Ответ 1

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

Ответ 2

Вы должны проверить подключение.

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

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

pool.setValidateConnectionOnBorrow(true);

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

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

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

Ответ 3

У меня была аналогичная ошибка, когда я пытался запустить statement.executeQuery() после dbConnection.close(). Помещенный dbConnection.close() после statement.executeQuery(), чтобы исправить ошибку.