【问题标题】:Error com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][3.64.82] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null错误 com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][3.64.82] 无效操作:结果集已关闭。错误代码=-4470,SQLSTATE=null
【发布时间】:2015-07-20 04:01:38
【问题描述】:

您好,我只在 DB2 中遇到过这个问题,我使用普通的 jdbc 来执行一个简单的查询。
然后我获取 ResultSet,在获取结果集期间,我调用另一个方法,该方法又执行另一个查询(打开和关闭另一个 ResultSet)。 当控件返回给调用者时,我原来的 ResultSet 已关闭,这真的很奇怪..
PS:我在下面发布的代码可以在 Sql Server 甚至 DB2 express 上正常工作,但是在驱动程序版本为 3.64.82 的客户端环境(Z/OS 上的 DB2)中。

..........
    PreparedStatement  pst=conn.prepareStatement(query);
    ResultSet rs=pst.executeQuery();

    while(rs.next()){
        System.out.println("Id:"+rs.getInt("ID"));
        System.out.println("ULTERIORE SPECIFICA   "+getUlterioreSpecifica(conn,rs.getInt("ID")));
        System.out.println("Desc: "+rs.getString("DESC"));
        System.out.println("ETA: "+rs.getInt("ETA"));

    }
    ........

//其他方法

    private static String getUlterioreSpecifica(Connection conn, int int1) throws Exception{

    String query="select ult_desc from specifica where id=?";
    String retVal="";
      PreparedStatement pst=conn.prepareStatement(query);
      pst.setInt(1, int1);
      ResultSet rs=pst.executeQuery();
      while(rs.next()){
          retVal=rs.getString(1);
      }
      rs.close();
      pst.close();
    return retVal;
}

【问题讨论】:

  • sql-server 标记是用于 Microsoft SQL Server 的,用它标记 DB2 问题是没有意义的。
  • 您是否在连接上禁用了自动提交?
  • 不,如果我只执行一个简单的查询(选择),我不明白为什么我必须禁用自动提交。你能解释一下吗?非常感谢
  • kjaklik刚刚发布的答案解释了它。您不必禁用自动提交,但驱动程序的行为会受到它的影响(特别是当许多驱动程序在提交时关闭光标并且 JDBC 要求在自动提交中执行新语句时,将自动提交先前的事务)

标签: java jdbc db2


【解决方案1】:

您可能在自动提交模式下工作,并且此特定驱动程序的默认行为可能是在提交时关闭结果集。

所以基于How can I avoid ResultSet is closed exception in Java?中的cmets

您需要做的是在创建语句时设置ResultSet.HOLD_CURSORS_OVER_COMMIT

【讨论】:

  • 您好,我会尽快尝试。还有一个问题,我在示例中看到我必须像这样声明外部语句: Statement st1 = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);然后是这样的内部语句:Statement st2 = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);这是正确的吗?我的意思是,据您所知,将驱动程序版本升级到较新的版本可以解决我的问题?
  • 外部语句需要有ResultSet.HOLD_CURSORS_OVER_COMMIT。可以在没有任何标志的情况下创建内部的。更新驱动程序会有所帮助,但这不是驱动程序中的错误,而是有效的行为,例如提高性能或减少数据库过热
  • 谢谢,但我也必须禁用自动提交,对吧?
  • 不,您要么禁用自动提交,要么添加此标志
  • 再次感谢,我什么时候可以在客户端环境上测试它会通知你!
猜你喜欢
  • 2013-02-20
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多