Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle DB:java.sql.SQLException:关闭连接_Java_Sql_Jdbc_Oracle10g - Fatal编程技术网

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

Oracle DB:java.sql.SQLException:关闭连接,java,sql,jdbc,oracle10g,Java,Sql,Jdbc,Oracle10g,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.DatabaseE

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)

我们从故障转移数据库连接中获得此错误。我们对其他数据库也使用相同的代码。但是,只有一个数据库可以看到这个问题。这是因为连接可能由于长时间的不活动而超时,我们正在尝试使用它吗?请让我知道如果你需要更多的细节

放弃连接超时设置为15分钟
InactivityTimeout设置为30分钟

表示连接已在某个点成功建立,但当您尝试在此处提交时,连接不再打开。您提到的参数听起来像是连接池设置。如果是这样,他们与这个问题无关。最有可能的原因是您和数据库之间的防火墙在一定的空闲时间后终止了连接。最常见的修复方法是在从连接池签出连接时使连接池运行验证查询。这将立即识别并排除失效的连接,确保您只能从池中获得良好的连接。

您必须验证连接

如果您使用Oracle,则很可能使用Oracle的。以下假设您这样做

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

pool.setValidateConnectionOnBorrow(true);
但只有在短时间内保持连接时,它才会起作用。如果您借用连接的时间较长,则在您持有连接时,连接很可能会断开。在这种情况下,必须使用显式验证连接

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

有关更多详细信息,请参阅。

谢谢您的回答。验证连接属性是否增加了任何开销?我只在一个数据库中看到了这一点,我也怀疑这个特殊的数据库有什么问题。它自然会增加一些开销,因为它必须实际访问数据库才能验证连接;但是,每个数据库都有一个建议使用的“验证查询”,它会在数据库端产生最小的开销,因此,无论网络延迟有多大,都会导致唯一的减速。不管问题是什么,添加验证查询是避免从池中获取死连接的一种非常简单的方法。我相信当前推荐的Oracle查询是
select1fromtoual
,如果您不能使用UCP或者不想解决Oracle工件在公共maven存储库上不可用的问题,我最近发现java.sql.Connection有一个isValid方法。它在超时情况下工作,并且oracle.ucp.jdbc.ValidConnection的isValid会导致我的定时记录器在java.lang.ClassCastException上崩溃