文档章节

ORA-01000: 超出打开游标的最大数

最王座
 最王座
发布于 2016/03/04 17:59
字数 521
阅读 1415
收藏 0

语言:java,数据库:oracle

开发中通过jdbc做批量删除对象时,出现了如下异常:

java.sql.SQLException: ORA-01000: 超出打开游标的最大数

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)

出现这种异常的原因很明确:超出打开游标的最大数。

分析:

Java代码中,执行conn.createStatement()或conn.prepareStatement()新建statement时,相当于在数据库中打开了一个cursor。所以,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题,因为游标在不停的打开却没有关闭。

解决这个问题的方法有两种:

  1. 修改数据库游标cursor上限值

    从上图中可以看出oracle当前数据库的游标cursor上限值是300,我们需要修改它的值,如下图所示将cursor值修改为最大值1000

    从上图可以看出oracle的游标值已经被修改为1000了。

    但是仔细思考就可以看出这种方法是治标不治本的,如果代码的循环次数增多,依然会出现当前这个异常,所以最根本的解决方法是重构代码。

  2. 重构java代码

        未重构前的代码片段:

for (long i = 0; i <= 10000; i++) {   
    String sql = "insert into telepnum values(" + i + ")";   
    stmt = con.createStatement(); // 这里是问题的所在   
    stmt.executeUpdate(sql);   
}

        重构后的代码片段:

for (long i = 0; i <= 10000; i++) {   
    String sql = "insert into telepnum values(" + i + ")";   
    stmt = con.createStatement(); // 这里是问题的所在   
    stmt.executeUpdate(sql);
    stmt.close(); //及时关闭statement 
}

        更好的解决方案是将con.createStatement()语句放到循环的外面,一劳永逸。

con = insert.getConnection();   
stmt = con.createStatement(); // 移动到这里,Statemet是可以重用的   
for (long c = a; c <= b; c++) {   
    String sql = "insert into telepnum values(" + c + ")";   
    stmt.executeUpdate(sql);   
}   
stmt.close(); //及时关闭statement


而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。


© 著作权归作者所有

最王座
粉丝 2
博文 48
码字总数 28698
作品 0
杭州
程序员
私信 提问

暂无文章

定时获取服务器时间戳的一个类(Typescript)

export class TimeStampService { private _local_timestamp: number; // 本地时间戳 private _server_timestamp: number; // 服务器端时间戳 private _duration: number = 1......

lilugirl
11分钟前
0
0
前段技术总结

前端UI框架组件库: 说到前端框架我第一印象中想起React、Vue和Angular,不知道你是否与我一样想到这些,现在常用的有:Bootstrap、jQuery UI、BootMetro、AUI常用的还有很多、就不一一跟大家...

WinkJie
30分钟前
0
0
对话亲历者|鲁肃:我在支付宝“拧螺丝“的日子

摘要: 他是支付宝技术平台的奠基人之一,但是他总说“这还不是我心中最完美的架构”;他行事低调但却有着“此时此地,非我莫属”的豪气;他曾无数次充当救火大队长,但自评只是“没有掉队的...

阿里云云栖社区
38分钟前
4
0
设置 npm yarn 淘宝源

设置npm config set chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver设置yarn config set "chromedriver_cdnurl" "https://npm.taobao.org/mirrors/chromedriver"......

internetafei
47分钟前
2
0
Docker搭建Mysql集群、主从同步复制

1、创建数据挂载点: mkdir /opt/mysql-master/mysql、/opt/mysql-master/conf.d、/opt/mysql-slave/mysql、/opt/mysql-slave/conf.d 2、分别在master、slave节点文件目录conf.d下创建touch......

WALK_MAN
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部