关闭

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

1213人阅读 评论(0) 收藏 举报

又到日志时间啦,最近工作上遇到一个问题,数据库在两个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,不然后患无穷啊。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    最新评论