`

超出打开游标的最大数异常

阅读更多

最近项目中报错:

java.sql.SQLException: ORA-01000: maximum open cursors exceeded
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedSt
即:打开的游标超出了游标的最大数:
分析:在这个业务中一次处理数据为1000条,通过命令:show parameter open_cursor;查看游标数量为3000,在这种情况下测试没问题;
修改游标数量为100,alter system set open_cursors=100;再测测试出现上述问题;经跟踪代码发现在程序
com.asiainfo.boss.so.ams.exe.ServiceTemp.serviceTemp(HashMap[])中端类似于下面的代码:
for (int i = 0; i < maps.length; i++){
pstmt = conn.prepareStatement(sql_up.toString());
*****
pstmt.execute();
}
在这种情况下游标不停的打开而没有关闭,当循环次数足够大时就会出现上面的错误。

解决方法:
1、增大游标的数量(不可取)
分析:
1.1、显然这种方法治标不治本,游标的数量往往设置一个 较小值即可,除非特殊情况;
1.2、应用程序不同,该值也不同
1.3、并么有根除代码上的缺陷
2、修改代码:
Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor,
当PreparedStatement或statement执行操作之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。
尤其是在循环中,因为游标一直在不停的打开,而且没有关闭;
综上所述:上面的代码在pstmt.execute();之后执行pstmt.close();方法即可

分享到:
评论

相关推荐

    超出打开游标的最大数的原因和解决方案

    超出打开游标的最大数的原因和解决方案 在 Oracle 数据库中,游标(cursor)是一种临时工作区,用于存储查询结果。每个会话可以打开多个游标,但存在一个限制,即 OPEN_CURSORS 参数指定的最大游标数。如果应用程序...

    Oracle出现超出打开游标最大数的解决方法

    当程序在处理大量数据或者进行复杂操作时,可能会遇到“超出打开游标最大数”的错误,即ORA-01000异常。这个错误通常表明数据库当前打开的游标数量超过了`open_cursors`参数所设定的最大值。 首先,我们需要理解为...

    Oracle数据库游标连接超出解决方案

    - 优化代码:查找并修正那些可能导致游标泄漏的代码段,确保每次打开游标后都正确关闭。 - 调整并发量:如果问题源于高并发操作,可能需要调整并发控制策略,例如使用批量处理,减少单个用户的游标使用。 - 监控...

    详解Oracle游标的简易用法

    忘记关闭游标可能导致超出打开游标最大数的错误。 - 游标也可以返回到存储过程或函数,使得调用者可以处理结果集。 10. **最佳实践**: - 只在必要时使用游标,因为它们消耗内存和CPU资源。 - 尽可能使用集操作...

    Oracle常用异常代码

    当尝试打开一个已经打开的游标时触发此异常。 **解决方法:** - 在打开新的游标之前关闭已有的游标。 - 确保游标的状态管理正确,避免重复打开同一游标。 #### 5. DUP_VAL_ON_INDEX (ORA-00001) **异常描述:** 当...

    oracle预定义异常

    6. INVALID_CURSOR:如果在不合法的游标上执行操作,比如一个已经关闭或从未打开过的游标,系统会抛出此异常。 7. INVALID_NUMBER:当尝试将字符串转换为数字,但转换失败时,Oracle会抛出此异常。 8. NO_DATA_...

    oracle异常处理

    6. `Invalid_cursor` (ora-01001):在非法游标上执行操作,如未打开游标即尝试提取数据。 7. `Invalid_number` (ora-01722):尝试将非法字符串转换为数字。 8. `No_data_found` (ora-01403):SELECT INTO 未返回任何...

    Oracle21个预定义异常

    - **场景示例**:如果试图从未开启的游标中读取数据,或关闭一个未被打开的游标,将触发此异常。 #### 7. INVALID_NUMBER - **异常描述**:当SQL语句无法将字符串转换为数值时触发。 - **错误代码**:ORA-01722 - *...

    根据表结构生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第4版)

    2、解决Oracle一次转换的表过多时出现超出打开游标的最大数异常,现在测试了一次生成四百多张表 的DTO和Entity成功完成转换,只是表太多速度有点慢。 3、内存占用优化,对占用的内存资源进行清理,极大的减少了...

    预定义异常

    - 举例:索引值不在合法范围内,如负数或超出最大限制。 16. **SYS_INVALID_ROWID (ORA-01410)** - 描述:字符到ROWID的转换失败,因为字符不代表有效的ROWID。 - 举例:尝试将无效的ROWID字符串转换为ROWID。 ...

    ORACLE 异常错误处理

    - `ORA-6511 CURSOR-already-OPEN`:试图打开一个已处于打开状态的游标。 - `ORA-6530 Access-INTO-null`:试图为null对象的属性赋值。 - `ORA-6531 Collection-is-null`:试图将Exists以外的集合方法应用于一个null...

    oracle异常(最全异常收集)

    - **异常说明**:游标已打开。 - **常见原因**: - 尝试在同一作用域内多次打开同一个游标。 - 未正确关闭游标。 - **解决方案**: - 确保每个游标仅在一个作用域内被打开一次。 - 在使用完游标后立即关闭它。 ...

    Oracle Exception汇总(自定义Oracle异常)

    16. **SUBSCRIPT_BEYOND_COUNT** (ORA-06533): 当尝试访问嵌套表或VARRAY元素的下标超出其范围时,会触发此异常。确保下标在有效范围内。 17. **SUBSCRIPT_OUTSIDE_LIMIT** (ORA-06532): 当使用嵌套表或VARRAY元素...

    oracle异常及触发器.pptx

    `Cursor_already_open`异常会在尝试打开已打开的游标时触发;`No_data_found`异常会在`SELECT INTO`语句未找到匹配行时触发;`Too_many_rows`异常则会在`SELECT INTO`语句返回多行时触发;`Invalid_number`异常出现...

    oracle常见Exception

    `INVALID_CURSOR`(ORA-01001)异常会在试图使用无效的游标时发生,比如游标已经被关闭或者从未被正确打开过。 **解决方法:** 1. **确保游标正确打开**:在执行任何读取或写入操作前,确认游标是有效的且处于打开...

    Oracle预定义的21个系统异常类型

    4. **CURSOR_ALREADY_OPEN**:当试图在一个已经打开的游标上再次执行OPEN语句时触发。每个游标只能处于打开状态一次,避免资源浪费和冲突。 5. **DUP_VAL_ON_INDEX**:在唯一性索引的列上插入或更新重复值时触发。...

    Oracle第三次考试答案

    - 动态游标:允许在打开游标时动态设定SQL语句,更灵活,适用于未知或变化的查询。 5. 动态执行SQL语句的游标: - 动态游标通过Ref Cursor类型实现,如示例所示,声明一个Ref Cursor类型的变量,然后在运行时通过...

    DB2 错误代码

    - **54000**:超出 SQL 限制,或超出产品限制,表示操作超出了 SQL 或产品的最大限制。 34. **55 - 对象不处于先决条件状态** - **55000**:对象不处于先决条件状态,表示对象的状态不符合操作的要求。 35. **56...

    DB2错误解决手册

    - **36** - **游标灵敏度异常**:游标灵敏度设置不正确。 - **38** - **外部函数异常**:外部函数调用过程中出现异常。 - **39** - **外部函数调用异常**:外部函数调用失败。 - **3B** - **SAVEPOINT无效**:...

    DB2错误代码.doc

    | 0100D | 关闭的游标已在链中的下一个结果集上重新打开。 | | 0100E | 生成的过程大于允许的最大结果集数目。只有第一个整数结果集已经返回到调用者。 | | 01503 | 结果列数比提供的主机变量数大。 | | 01504 | ...

Global site tag (gtag.js) - Google Analytics