ProC血的教训之二!游标使用完关闭之后最好释放!

原创 2013年12月04日 12:12:55

在经历上一个教训并解决问题之后,本以为可以高枕无忧了,结果又遇到一个问题,在多次拔插网线之后,程序运行到fetch cursor的时候就崩掉了,任何信息都没有提示。我确定是上下文的问题,但是怎么也改不好,我的程序没有用到多线程,而且reconnect之前也都关闭数据库连接了,为了确定使用全局上下文,我在每个函数开始的地方加了EXEC SQL CONTEXT USE DEFAULT这句,还是在EXEC SQL处崩溃!又花了我半天的时间,终于找到原因。

在最后时刻,我想,为什么这次出现问题的总是游标?而且总是在fetch的地方?为什么declare 游标没问题,open也没问题?我在fetch游标之前加了一句普通的SQL,发现是没问题的,这更加让我确定是游标的问题。可是开始游标是可以正常执行fetch的啊,我每次都declare-->open-->fetch-->close,对了,程序每次都declare,这不是重复声明吗?为什么之前没有问题,close对应的貌似是open,declare的时候或许是这样的,如果没有这个游标就创建,有的话就使用原来的,难道declare对应的还有一个反操作?我能想到的就是销毁或者就是RELEASE,于是网上一搜,还真有,是我基础不扎实,关键在下面这段话:


关于游标的释放

在一个连接中,若该连接引用记数为1,则关闭该连接也释放游标;如在同一个进程中打开连接,操作数据,关闭连接。

若连接记数大于1,如父进程打开连接,子进程共享该连接进行操作,则连接记数大于1,子进程不能做关闭连接操作。此时要释放一个游标,在关闭游标后,还必须做commit或rollback;此外,还要设置release_cursor选项为yes,设置方法是在proc命令行中增加release_cursor=yes,或在程序中编写:

EXEC ORACLE OPTION(RELEASE_CURSOR=YES);  

否则不能释放,最终会报-1000错:maximum open cursors exceeded。

我有点明白了,declare的游标也是与数据库连接或者上下文绑定的,如果没有释放的话,这个游标还是存在的,那么当程序连接换到另一个时,使用游标却还是在原来的那个连接上,所以可能会导致莫名奇妙的错误。于是我在游标close之后加了

EXEC ORACLE OPTION(RELEASE_CURSOR=YES),经过测试,没有再出现程序崩溃的问题。
因此,在程序可能会使用多个数据库连接的情况,游标使用完最好要释放。

Oracle临时表游标未释放导致回滚段空间不足的解决方案

Oracle临时表游标未释放导致回滚段空间不足时会报出多个ORA-01650错误,造成数据库无法运行。本文我们主要就介绍了这一问题的解决方案,接下来就让我们来一起了解一下这部分内容。   先分析一下...

oracle超出打开游标的最大数的原因和解决方案

处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded) ORA-01000_maximum_open_cursors_exceeded_ ...
  • kai27ks
  • kai27ks
  • 2012年06月05日 10:36
  • 42354

最好不要使用游标

在存储过程的处理中,如果遇到对一张表的数据遍历,我们通常会使用游标进行。 但是,根据程序的执行效果来看,游标存在以下问题:   ①游标是存放在内存中,很费内存。游标一建立,就将相关的记录锁住,直到取消...

Oracle DML语句概述

DML语句包括: SELECT INSERT UPDATE DELETE MERGE DML语句错误的原因:1、语法错误2、引用不存在的对象和列3、访问权限问题4、违反约束条件5、空间问题 控制事务一...
  • DBAFAN
  • DBAFAN
  • 2011年07月27日 10:15
  • 2106

ORACLE索引的日常维护

为提高查询的效率而引入索引概念。在索引记录中存有索引关键字和指向表中真正数据的指针(地址),可以存在与表不同的表空间。 索引分为:B-树索引和位图索引。 B-树索引:适合于联机事务处理系统,因为D...

ProC血的教训!Connect失败也必须RELEASE!

又到日志时间啦,最近工作上遇到一个问题,数据库在两个IP地址上监听,所以程序在检测到数据库连接断开后,就要切换到另一个IP上去连接数据库,因此我写了一个函数去做这件事,主要就是 EXEC SQL CO...
  • herobox
  • herobox
  • 2013年12月03日 18:15
  • 1358

Linux3.10内核之后proc文件系统的使用

最近在通过无线扫描周边的手机mac的事情,拿到AP周边的mac后需要送到应用层,...

proc_create实践(linux用户空间和内核空间交互之二)

1、proc_create实例 static int mytest_flag = 0;//create flag variable static ssize_t mytest_proc_write...
  • lz_1990
  • lz_1990
  • 2015年06月12日 21:10
  • 1399

游标、例外、存储过程、存储函数、java调用存储过程、触发器(Oracle之二)

--游标(光标) 一般用于多行数据 语法:cursor 游标名称 (参数名 参数类型 ..) is select语句 --操作游标 open 游标名; --打开游标 loop   fetch...

Xcode调试技巧之二 crash之后的定位问题

转载:http://blog.163.com/gf_zl818/blog/static/8380806820125435918564/ 论坛里经常有朋友会问Crash的问题。Crash最多的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ProC血的教训之二!游标使用完关闭之后最好释放!
举报原因:
原因补充:

(最多只允许输入30个字)