Oracle DB: 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.jdbc.driver.DatabaseError .throwSqlException (DatabaseError.java:208) в oracle.jdbc.driver.PhysicalConnection.commit (PhysicalConnection.java:1131) в oracle.jdbc.OracleConnectionWrapper.commit (OracleConnectionWrapper.java:117)

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

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

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

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

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

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

 pool.setValidateConnectionOnBorrow(true); 

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

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

Дополнительную информацию см. В документации Oracle .

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