【问题标题】:PreparedStatement executeQuery closes ResultSet when called twicePreparedStatement executeQuery 在调用两次时关闭 ResultSet
【发布时间】:2022-01-12 19:01:32
【问题描述】:

我正在开发一个 Java 8 项目,该项目最近将其 ojdbc (oracle) 驱动程序从 ojdbc6:11.2.0.4 升级到 ojdbc8:19.3.0.0。升级导致一些现有代码出现问题,如下所示...

根据我在 Oracle 的 ResultSet 上阅读的文档,“当生成它的 Statement 对象关闭或重新执行时,ResultSet 对象会自动关闭”,我假设 重新执行 部分实际上是关闭“resultSetOne”,但很难通过驱动程序反编译源进行调试来说明。

PreparedStatement stmt = PreparedStatements.getInstance().getStatement("someQuery");

// Assume this returns 2 results for this example
ResultSet resultSetOne = stmt.executeQuery();

while (resultSetOne.next()) {

    // This invocation closes resultSetOne
    ResultSet resultSetTwo = stmt.executeQuery();
}

生成的堆栈跟踪:

java.sql.SQLException: Closed Resultset: next
at oracle.jdbc.driver.InsensitiveScrollableResultSet.ensureOpen(InsensitiveScrollableResultSet.java:116)
at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:404)

我处于无法更改代码的情况。我正在寻找一个潜在的 vm 参数,可以让我通过这个特定的驱动程序解决这个问题,我用谷歌搜索无济于事,有人有什么想法吗?

【问题讨论】:

  • 除了修复代码之外,您无能为力。对不起。
  • 不确定它是否会有所帮助,但您是否也尝试过(运行)较新的 jre 版本?过去我在更新 mysql 驱动程序时遇到了一些奇怪的问题;我的代码在 java5 中的行为不正确,但在 java6 中正确(可能是由于 jdbc 规范兼容性问题)

标签: java oracle jdbi


【解决方案1】:
  1. 降级到旧的 jdbc 驱动

  2. 构建一个自定义驱动程序 jar,它使用您需要的语义包装准备好的语句(这很恶心,但可以工作)

如果您无法更改任何代码,那么切换回旧驱动程序并向 Oracle 提出有关行为上的重大变化的问题是您唯一真正的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多