前天一同事在从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的赋值即可解决该问题。 ^_^