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) 在oracle.jdbc.OracleConnectionWrapper.commit(OracleConnectionWrapper.java:117)
我们从故障转移数据库连接中收到此错误。我们也为其他数据库使用相同的代码。但只与其中一个数据库一起看这个问题。这是因为由于长时间不活动而连接可能会超时,我们正在尝试使用它吗?如果您需要更多详细信息,请告诉我......
AbandonedConnectionTimeout设置为15分钟 InactivityTimeout设置为30分钟
答案 0 :(得分:43)
这意味着在某些时候成功建立了连接,但是当您尝试在那里提交时,连接不再打开。您提到的参数听起来像连接池设置。如果是这样,他们就与这个问题无关。最可能的原因是您和数据库之间的防火墙在一定的空闲时间后终止连接。最常见的修复方法是在从中检出连接时使连接池运行验证查询。这将立即识别并驱逐死亡连接,确保您只能从池中获得良好的连接。
答案 1 :(得分:9)
您必须验证连接。
如果您使用Oracle,则很可能使用Oracle的Universal Connection Pool。以下假定您这样做。
验证连接的最简单方法是告诉Oracle必须在借用连接时验证连接。这可以通过
完成pool.setValidateConnectionOnBorrow(true);
但只有在短时间内保持连接时才有效。如果您长时间借用连接,则在保持连接时可能会断开连接。在这种情况下,您必须使用
显式验证连接if (connection == null || !((ValidConnection) connection).isValid())
有关详细信息,请参阅Oracle documentation。