Oracle DB : java.sql.SQLException: Closed Connection

2022-09-01 04:27:10

Java.sql.SQLException的原因:来自Oracle的封闭连接??

java.sql.SQLException: Closed Connection 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)

我们从故障转移数据库连接中得到此错误。我们也对其他数据库使用相同的代码。但是,只有一个数据库会出现此问题。这是因为连接可能由于长时间不活动而超时,并且我们正在尝试使用它吗?如果您需要更多详细信息,请告诉我...

被遗弃连接超时设置为 15 分钟 不活动超时设置为 30 分钟


答案 1

这意味着连接在某个时候已成功建立,但是当您尝试在那里提交时,连接不再打开。您提到的参数听起来像连接池设置。如果是这样,它们与此问题无关。最可能的原因是您和数据库之间的防火墙在一定空闲时间后终止连接。最常见的解决方法是在从连接池签出连接时使连接池运行验证查询。这将立即识别并逐出死连接,确保您只从池中获得良好的连接。


答案 2

您必须验证连接。

如果您使用 Oracle,则很可能使用 Oracle 的通用连接池。以下假定您这样做。

验证连接的最简单方法是告诉 Oracle,在借用连接时必须验证连接。这可以通过以下方式完成

pool.setValidateConnectionOnBorrow(true);

但只有当您保持连接很短的时间时,它才有效。如果借用连接的时间较长,则连接可能会在您保持连接时断开。在这种情况下,您必须使用 显式验证连接

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

有关更多详细信息,请参阅 Oracle 文档


推荐