今天遇到个问题,头都懵了。。。
啥嘛,从来没见过。。
嘿嘿,还好,感谢网络,感谢百度,百度一把去。。
还真不少,就拿来做个记录。
具体如下:
“
ORA-01000: maximum open cursors exceeded 游标超出最大连接数(据说是错误的中文解释)
先来说说游标是什么,以及游标的优点。
在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条T_SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。
关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where子句来限制只有一条记录被选中。因此必须借助于游标来进行面向单条记录的数据处理。
由此可见,游标允许应用程序对查询语句select返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
游标有显式游标和隐式游标,并不是没有显式的调用游标就不会使用到游标,有些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语句会调用到隐式游标。
”
听的,看的稀里糊涂,还是有机会练练手,多关心下。
About Exception "ORA-01000: maximum open cursors exceeded"
最新推荐文章于 2021-02-27 13:07:11 发布