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),经过测试,没有再出现程序崩溃的问题。
因此,在程序可能会使用多个数据库连接的情况,游标使用完最好要释放。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

PROC--oracle中游标的使用

Oracle中的游标 Oracle使用两种游标: 显式游标和隐式游标.  不管语句返回多少条记录, Oracle为 每条使用的SQL语句隐式地定义一个游标. Oracle 为每个DELETE , ...

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

1、proc_create实例 static int mytest_flag = 0;//create flag variable static ssize_t mytest_proc_write...

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

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

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

转载:http://blog.163.com/gf_zl818/blog/static/8380806820125435918564/ 论坛里经常有朋友会问Crash的问题。Crash最多的...

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

论坛里经常有朋友会问Crash的问题。Crash最多的无非就两种,一种就是signal SIGABRT,大概的意思就是发送Message出现问题,信号迷失了。 这种的Crash其实是很好定位,C...

学生信息管理系统总结之二 :继安装sql之后的配置ODBC

首先给大家小伙伴分享给我的的配置ODBC的步骤: 配置odbc 那么再来说说我配置中的问题吧!巴拉巴拉巴拉巴拉巴拉巴拉小魔仙……,回归正题,其实遇到很多问题 1 附加文件附加不上,大家都知道,要把...
  • hdy14
  • hdy14
  • 2017-07-23 11:03
  • 329

proc 游标讲述

  • 2012-11-06 10:33
  • 30KB
  • 下载

Proc *C/C++入门之游标访问数据库

数据类型转换 Oracle外部数据类型中的string是以零结尾的字符串,类似于varchar2类型! char在数据不满的时候,后面部分会被填充为空格 在SQL语句中的宿主数据类型可以人为的转换为O...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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