Oracle DB:java.sql.SQLException:已关闭连接

Jav*_*Guy 33 java sql jdbc oracle10g

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

java.sql.SQLException:oracle.jdbc.driver.DatabaseError上的oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)处的oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)处的已关闭连接.throwSqlException(DatabaseError.java:208)位于oracle.jdbc.OracleConnectionWrapper.com的oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:1131)(OracleConnectionWrapper.java:117)

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

AbandonedConnectionTimeout设置为15分钟InactivityTimeout设置为30分钟

Rya*_*art 44

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

  • 它自然会增加一些开销,因为它必须实际命中数据库才能验证连接; 但是,每个数据库都有一个推荐的"验证查询"使用,这会在数据库端产生最小的开销,因此您将获得的唯一减速是来自任何网络延迟.无论出现什么问题,添加验证查询都是一种非常简单的方法,可以避免从池中获取死连接.我相信当前推荐的Oracle查询是`select one from dual` (4认同)

cev*_*ing 9

您必须验证连接.

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

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

pool.setValidateConnectionOnBorrow(true);
Run Code Online (Sandbox Code Playgroud)

但只有在短时间内保持连接时才有效.如果您长时间借用连接,则在保持连接时可能会断开连接.在这种情况下,您必须明确验证连接

if (connection == null || !((ValidConnection) connection).isValid())
Run Code Online (Sandbox Code Playgroud)

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

  • oracle.ucp.jdbc.ValidConnection 的 isValid 导致我的计划记录器在 java.lang.ClassCastException 上崩溃 (2认同)