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

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

EXEC SQL CONNECT :uid1,不行的话就EXEC SQL CONNECT :uid2


结果在测试的时候,开始还奏效,在插拔几次网线之后,程序就崩了,主要表现:

连接是提示成功了,但是一执行SQL语句就崩,屏幕输出

“pthread_mutex_lock __pthread_mutex_lock_full: Assertion failed with robust and 0x4000000”这样的错误,

或者有时候连接都没成功,屏幕输出

“OCI-21500: internal error code, arguments: [kghfrmrg:nxt]”这样的东东。

把我郁闷坏了,这个问题我调了差不多1天,怀疑跟多线程的锁有关系,又怀疑我Connect 远程数据库的uid格式有问题,反正把能想到的都改了一个遍,还是问题依旧。

最后我都要放弃了,自己写了一个小程序试了一下,终于找到了问题所在:

我在连接数据库的时候,CONNECT :uid,通过判断sqlcode确定连接数据库成功与否。但是如果没成功,我就没有RELEASE.因为我开始认为,都没连接成功,干嘛需要RELEASE。事实证明我错了,如果不RELEASE,程序提示“OCI-21500: internal error code, arguments: [kghfrmrg:nxt]”这样的东东,而且其实没连接成功,sqlcode也等于0!!!

我认为由于没有RELEASE,造成了嵌入式SQL的上下文混乱,结果oracle也晕了,oracle晕了就挂了。

我猜测Connect的时候,程序将自己与oracle的连接进行了绑定,RELEASE不仅仅是关闭连接,而且那些连接信息也会进行清理。

具体的大道理咱也说不明白,总之Connect用完之后或者失败必须RELEASE,不然后患无穷啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值