错误的中文解释为:游标超出最大连接数
游标具体是个什么东西就不多说了,只说明一点:游标有显式游标和隐式游标,并不是没有显式的调用游标就不会使用到游标,有些SQL语句是会调用隐 式游标的,这就是为什么有人没有显式的调用游标却出现了上面的错误提示。
出现这种错误提示大多是因为OracleConnection,OracleDataReader使用完后没有正常的关闭造成的。只要使用后立即 关闭掉就可以了,即调用相应的Close()就可以了。对于OracleDataReader来说一定要调用Close()关掉。
用以上方法就可以解决问题,下面是我解决问题的过程,毕竟“授之以鱼,不如授之以渔”
OracleDataReader比较特殊,使用完后如果没有关掉,只关掉了OracleConnection,Oracle数据库中的游标还是会 存在的。当系统运行一段时间,未关掉的游标会越来越多,当超出ORACLE设置的最大值时也就出现了上诉的错误。这个最大值以ORACLE10g为例是 300,保存在oracle\product\10.1.0\admin\orcl\pfile目录下的init.ora文件的open-cursors 参数里。
首先对想通过吧open—sursors这值改大些来避免问题的人说,这样改的话有可能会避免该问题,使其以后不再出现,但是避免问题不是解决问题 的好办法,因为这样处理问题会留下很大的隐患,问题不知道什么时候又会出现。到时候在哭就来不及了。要发现问题的产生原因,然后解决它。
以下是发现问题的方法。
select * from v_$open_cursor where user_name='****'
以sys用户登录后,执行以上语句试下能看到什么,其中那个****是程序中连接数据库的用户名。执行后可以看到这是查看****用户未释放的游标 是有那些SQL语句执行的。是不是很绕口的一句话。动手试下你就会明白了。
如果吧SQL语句改成 select count(*) from v_$open_cursor where user_name='****' 又会怎样呢?那就是这个用户当前有几个游标未释放。看这个值有什么意义呢?前面提到过ORACLE10G的默认最大游标数是300吧。对了。当查看的这个 值超过300就出现问题了。你可以找个调用了OracleDataReader的地方,在执行代码前后分别执行下这个SQL语句,你就明白游标数为什么会 一致增大,最后导致超出最大游标数了。
如果在遇到ORACLE游标的问题不妨用这种方法找找产生这些游标的地方到底在哪里。愿意的话也可以用 OracleDataReader执行不同的SQL语句,看看那些SQL语句会调用到隐式游标。