代码访问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的赋值即可解决该问题。 ^_^  

 

posted @ 2009-12-05 07:08  FallingAutumn  阅读(1601)  评论(0编辑  收藏  举报