`
devon.k
  • 浏览: 90585 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Oracle中打开游标超出最大值

阅读更多
向Oracle数据库表中插入十几万条数据,可是当插入3万多条后,程序就抛
ORA-01000 maximum open cursors exceeded
异常信息。Google了异常信息,得知这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当于在数据库中打开了一个cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。
一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭(statementName.close())。
下面将代码附上
抛异常代码:
	Connection conn = DBUtils.getConnection();//获取数据库连接
	PreparedStatement pstmt = conn.prepareStatement("select statement...");
	ResultSet rset = pstmt.executeQuery();
	while (rset.next()) {					
		PreparedStatement pst=conn.prepareStatement("insert statement...");//开启一个游标
		//pst.setXXX()...;
		pst.executeUpdate();
			
		pst=conn.prepareStatement("another insert statement");//再开启一个游标
		//pst.setXXX()...;
		pst.executeUpdate();

		pst=conn.prepareStatement("third insert statement");//开启一个游标
		//pst.setXXX()...;
		pst.executeUpdate();
		pst.close();
	}
	rset.close();
	pstmt.close();
	conn.close();


更正后的可行代码:
	Connection conn = DBUtils.getConnection();//获取数据库连接
	PreparedStatement pstmt = conn.prepareStatement("select statement...");
	ResultSet rset = pstmt.executeQuery();
	while (rset.next()) {					
		PreparedStatement pst=conn.prepareStatement("insert statement...");
		//pst.setXXX()...;
		pst.executeUpdate();
		pst.close();//及时关闭Statement
			
		pst=conn.prepareStatement("another insert statement");
		//pst.setXXX()...;
		pst.executeUpdate();
		pst.close();

		pst=conn.prepareStatement("third insert statement");
		//pst.setXXX()...;
		pst.executeUpdate();
		pst.close();
		pst = null;
	}
	rset.close();
	pstmt.close();
	conn.close();


分享到:
评论
1 楼 dacoolbaby 2013-04-10  
……楼主为啥不手动使用提交事务呢?
每500条commit一次。。

相关推荐

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

    应用程序打开的游标数超过 OPEN_CURSORS 参数指定的最大值是超出打开游标的最大数的主要原因。OPEN_CURSORS 参数的默认值为 50,但可以根据需要进行修改。当应用程序打开的游标数超过这个限制时,Oracle 数据库将...

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

    这个错误通常表明数据库当前打开的游标数量超过了`open_cursors`参数所设定的最大值。 首先,我们需要理解为什么会出现这样的问题。在Java中,当我们使用`conn.createStatement()`或`conn.prepareStatement()`创建...

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

    当数据库中的游标数量超出预设限制时,就会出现“游标连接超出”的问题,这可能导致数据库性能下降甚至无法正常连接。以下将详细介绍这个问题的原因、如何检查和解决。 1. **游标超限的原因** - 大量未关闭的游标...

    详解Oracle游标的简易用法

    Oracle游标是数据库管理系统中的一种数据处理机制,它允许我们逐行处理查询结果,而不仅仅是一次性获取所有数据。在Oracle数据库中,游标对于处理大量数据或者需要分步执行复杂操作的情况尤其有用。以下是关于Oracle...

    类型长度大于最大值(Java调用存储过程)

    标题与描述均指出的问题是“类型...总之,“类型长度大于最大值”问题在Java调用Oracle存储过程中并不罕见,但通过上述分析与建议,大多数情况下可以有效解决。关键在于确保软硬件环境的一致性,以及代码实现的严谨性。

    Oracle错误码大全

    1. ORA-01000: 达到最大打开游标数 - 表示应用程序打开了过多的游标,超过了系统允许的最大值。解决方法是优化代码,关闭不再使用的游标,或者增加`OPEN_CURSORS`初始化参数的值。 2. ORA-01422: 指定的行数超出...

    oracle预定义异常

    11. SUBSCRIPT_BEYOND_COUNT:当尝试访问嵌套表或VARRAY的元素,其下标超过了其定义的最大值,会触发此异常。 12. SUBSCRIPT_OUTSIDE_LIMIT:当你对嵌套表或VARRAY使用负数下标,或者下标超出其范围时,会抛出此...

    Oracle常用异常代码

    在PL/SQL中当赋给变量的值不符合预期或超出范围时触发此异常。 **解决方法:** - 检查赋值操作是否正确。 - 使用适当的错误处理逻辑来捕获并处理此类异常。 #### 14. LOGIN_DENIED (ORA-01017) **异常描述:** 当...

    Oracle9i的init.ora参数中文说明

    值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: BINARY nls_currency: 说明: 为 L 数字格式元素指定用作本地货币符号的字符串。该参数的默认值由 NLS_TERRITORY ...

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

    Oracle预定义的21个系统异常类型是Oracle数据库在运行过程中遇到特定错误情况时自动触发的预设异常。这些异常帮助开发人员和数据库管理员识别并处理数据库操作中的常见错误,从而增强应用程序的健壮性和用户体验。...

    oracle 错误合集

    **ORA-17070**:小数精度溢出错误,通常是因为数值精度超过允许的最大值。 **ORA-17071**:VARRAY 操作错误,可能是因为 VARRAY 使用不当。 **ORA-17072**:说明值太大错误,通常是因为值超出允许的最大范围。 **...

    Oracle错误一览表

    当一个会话达到其资源限制时,如最大打开游标数、最大连接时间等,会抛出此错误。这通常意味着会话配置需要调整,或者系统资源不足。 #### ORA-00021: Instance recovery in progress 在实例恢复过程中执行操作时...

    oracle异常及触发器.pptx

    在这个例子中,如果新插入的学生将使班级人数超过最大值,触发器会抛出一个自定义异常。 总之,Oracle异常处理和触发器是数据库管理的重要工具,它们可以帮助开发者优雅地处理错误,保持数据一致性,并在后台实现...

    ora_error大全.doc

    9. **ORA-12009**: 数据长度超过了允许的最大值,可能涉及到LONG类型的字段。 10. **ORA-12010**: 系统权限问题,可能尝试执行无权进行的操作。 11. **ORA-12011**: 一个异常错误导致了子程序的执行被中断。 12. ...

    预定义异常

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

    pro*c编译选项_中文解释

    定义了预编译SQL语句中字符串常量的最大长度。超出此限制的字符串将被分割成多个常量,这可能会影响性能。 #### 15. maxopencursors 设置了同时打开的游标数量上限。超过这个数量,后续的游标打开请求将失败,这有...

    PL_SQL用户指南与参考.doc

    除了在数据库中运行外,PL/SQL也可以在多种Oracle工具中使用,比如Oracle SQL Developer、Oracle GoldenGate等,这些工具提供了丰富的界面和功能支持PL/SQL开发。 ##### 三、PL/SQL的优势 **1、SQL的支持** PL/SQL...

    数据库参数设置技术手册.doc

    数据库参数设置是优化数据库性能的关键环节,特别是在Oracle数据库系统中,正确配置参数能极大地提升数据库的运行效率。以下是对文档中提及的一些重要参数的详细解释: 1. **BUFFER_POOL_KEEP**:这个参数定义了...

    只能在PL/SQL中访问联合数组。

    在Oracle数据库的PL/SQL环境中,联合数组(Varying Array)是一种特殊的变量类型,它允许程序员存储一组相同类型的元素,这些元素可以是数值、字符串或其他复杂的数据类型。联合数组在PL/SQL中扮演着重要角色,特别...

Global site tag (gtag.js) - Google Analytics