Oracle cursors问题:Ora-01000

        从同事手上交接系统,遗留的问题,数据中心说系统用着经常会报java.sql.SQLException: ORA-01000: maximum open cursors exceeded异常,以前也不关注这个错误,也不认识他,上网查了下是数据库的游标超过了最大数。

        这个错误的主要原因是代码不健壮引起的,ora-01000: maximum open cursors exceeded. 表示已经达到一个进程打开的最大游标数。

     我们在使用conn.createStatement()或conn.prepareStatement()时相当于在数据打开一个cursor,当这个cursor资源一直被打开,资源一直被占用着,数量以达到一定的量就会报 ora-01000: maximum open cursors exceeded.

        而这个cursor一直打开中没有关闭有两个可能:

        1、createStatement()/prepareStatement()写在了循环里面,循环的量比较大导致一直在打开游标,而且没有及时的关闭。

        2、在一个与数据库交互的内部又有另外的数据库交互动作即在rs.next()中有createStatement()/prepareStatement(),而内部的数据库交互会有抛异常,在没有finally处理的情况下,内部和外部的rs结果集和statement都不能得到关闭,对应的游标一直打开着,时间一长也会有这个问题。

             pst = con.prepareStatement(sSql1);
             rs = pst.executeQuery();
             if(rs.next()) {
                 System.out.println("rs statement" + "----" +i);
                 pst1 = con.prepareStatement(sSql2);
                 rs1 = pst1.executeQuery();
                 if(rs1.next()) {
                     System.out.println("rs1 statement");
                     pst2 = con.prepareStatement(sSql3);
                     rs2 = pst2.executeQuery();
                     if(rs2.next()) {
                         System.out.println("rs2 statement");
                         throw new Exception();
                      }
                  }
              }

        我遇到的问题就是属于第二种,代码如上,在rs2中处理抛出异常,没有try{}catch() {}finally{}处理,rs/rs1/rs2、pst/pst1/pst2都将得不到及时的关闭。

        一般来说,我们在写createStatement()/prepareStatement()都应该放在循环之外,而且在使用了这些statement之后及时关闭,最好是在执行完executeQuery、executeUpdate等之后,若不在需要使用rs结果集的数据,就马上吧statement关闭。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值