代码访问Oracle,出现ORA-01000超出打开游标的最大数 错误之解决方法

前天一同事在从excel中批量导入数据时,出现 ORA-01000 的错误。

网上google了下,有类似现象出现过,是Java代码访问oracle时出现的,而我们用的是c#,应该原因是一样的。

Java情景如下(伪代码描述):

1、创建Connection,创建Transaction

2、循环创建Statement,附sql,执行Statement

3、事务Commit,Conn关闭释放

 

C#情景如下(伪代码描述):

1、创建Connection,创建Transaction

2、循环创建Commander,附sql,执行Commander

3、事务Commit,Conn关闭释放

  

 但结果都出现如题错误,当多批量操作时。

看下游标的默认连接数:show paramenter cursor , 300

而我们同事执行批量导入的执行次数也是在>300时出错。 由此可断定与cursor的设置有关。


解决方法:

1、增大默认cursor数量(但很别动)

2、程序代码中解决。

分析:上述场景代码中,循环体中的Statement和Commander对象,都是每次创建的。难道是这个引起的:每次循环后就该被回收(.NET&JAVA都可自动回收对象),但因为GC来不及处理,导致来不及释放,而导致cursor超过默认限制数?

尝试:循环体中每次都手动关闭Statement和Commander对象。 结果错误不在...

原因:果真是我们想象的那样,一个Statement/Commander也即对应一个Connection上的一个cursor。

解决方法:那就很简单了,既然知道这个原因。恩,每次循环体中关闭Statement/Commander,或者在循环体外声明此对象,循环体内进行sql的赋值即可解决该问题。 ^_^  

 

转载于:https://www.cnblogs.com/FallingAutumn/archive/2009/12/05/1617395.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值