下面是简化后的代码片段:transaction begin
    for(............){
    
    try{
     ps=conn.prepareStatement(....);
     rs = stmt.executeQuery();
rs.close();
stmt.close();
stmt = conn.prepareStatement( sql.toString() );
     stmt.executeUpdate();
         }catch
         ........
         }finally {
stmt.close
conn.close

}
    }
transaction commit   问题描述: 
    commit之前出现了 ORA-01000: maximum open cursors exceeded 异常,
    想问是否commit之前所有打开的cursors不会关闭?即使显示调用了close
    
    针对上面这样的程序逻辑有没有办法回避上述问题?

解决方案 »

  1.   

    把transaction放入for循环,每次循环算作一个事务
      

  2.   

    谢谢楼上的
     但要求所有的INSERT必须要在一个事务中
      

  3.   

    用这种方法我没有测试过 但我不想改动现有的代码,因为实际上刚才的代码片段是封装在DAO里面的,改动回比较大
      

  4.   

    参考一下http://www.blogjava.net/snoopy/archive/2005/01/27/744.html
    尝试在for循环外创建Statement和PreparedStatement
      

  5.   

    对不起 conn.close  那句没有 是我写错了 是在外面关闭的
      

  6.   

    下面是简化后的代码片段:transaction begin
        for(............){
        
        try{
        ps=conn.prepareStatement(....);
        rs = stmt.executeQuery();
    rs.close();
    stmt.close();
    stmt = conn.prepareStatement( sql.toString() );
        stmt.executeUpdate();
             }catch
             ........
             }finally {
    stmt.close
    }
        }
    transaction commit   问题描述: 
        commit之前出现了 ORA-01000: maximum open cursors exceeded 异常,
        想问是否commit之前所有打开的cursors不会关闭?即使显示调用了close
        
        针对上面这样的程序逻辑有没有办法回避上述问题?前提:上面的东东是firestorm生成的insert方法 我不想改动
    大家来整啊 如果改写代码当然可以解决  但我不想做,因为我的数据操作全是FireStorm生成的,不想动了 要是有办法解决我再开帖给100分。 呵呵 :) 说话绝对算数~~~否则不混了