我们最近将Oracle数据库从11g版本2升级到19c。
现在我们有Oracle 19c数据库服务器,JDK 1.8和ojdbc6.jar组合。
我们有一些java代码来创建具有可滚动和并发只读ResultSet特性的JDBC语句对象。
方法1:
Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet resultSet = statement.executeQuery(query);
后升级语句。executeQuery()方法抛出以下异常
java.sql.SQLRecoverableException: Closed Connection
at oracle.jdbc.driver.OracleStatement.ensureOpen(OracleStatement.java:4477)
at oracle.jdbc.driver.OracleStatement.clearWarnings(OracleStatement.java:3430)
at oracle.jdbc.driver.OracleStatement.prepareForNewResults(OracleStatement.java:3946)
at oracle.jdbc.driver.OracleStatement.doScrollExecuteCommon(OracleStatement.java:5246)
at oracle.jdbc.driver.OracleStatement.doScrollStmtExecuteQuery(OracleStatement.java:5302)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1325)
at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:422)
at JDBCConnectionUtilDebug.getQueryOutput(JDBCConnectionUtilDebug.java:294)
但是如果我使用下面的方法运行相同的sql查询,那么它就可以正常工作
方法2:
Statement stat = connection.createStatement();
boolean ret = stat.execute(query");
if (ret) {
ResultSet rs = stat.getResultSet();
为什么Approach1失败而Approach2正常工作?
1条答案
按热度按时间xzlaal3s1#
感谢@Mark Rotteveel和@ibre5041的回复。
根据[Oracle JDBC版本与JDK版本有哪些?] https://www.oracle.com/in/database/technologies/faq-jdbc.html
19 C数据库、java 1.8和ojdbc6.jar的组合不兼容。
Oracle JDBC驱动程序始终与每个新版本中的最新JDK版本兼容。在某些版本中,JDBC驱动程序支持多个JDK版本。请使用下表根据首选JDK版本选择正确的JDBC驱动程序。
Oracle数据库版本
19.x
版本特有的JDBC Jar文件
在使用ojdbc8.jar而不是ojdbc6.jar之后,两种查询执行方法都可以正常工作。