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

原创 2013年12月03日 18:15:25

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

IMP 导入数据报错 OCI-21500 OCI-22275

IMP导入数据报错如下: OCI-21500: internal error code, arguments: [kgepop: no error frame to pop to], [], [],...
  • xyy27
  • xyy27
  • 2013年10月13日 09:49
  • 2010

tcp 在调用connect失败后要不要重新socket

原文  http://blog.csdn.net/junjun150013652/article/details/37966901 主题 Socket TCP/IP 对TCP套接字...
  • occupy8
  • occupy8
  • 2015年09月06日 23:12
  • 5079

Debug下正常,而Release失败的原因

关于Debug和Release之本质区别的讨论  一、Debug 和 Release  编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程...
  • encoder1234
  • encoder1234
  • 2016年11月29日 13:50
  • 1348

Debug下正常,而Release失败的原因

关于Debug和Release之本质区别的讨论  一、Debug 和 Release  编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。...
  • qq_28796345
  • qq_28796345
  • 2016年06月03日 00:07
  • 2668

C/C++ socket编程教程之五:使用bind()和connect()函数

socket() 函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的IP地址和端口绑定起来,只有这样,流经该IP地址和端口的数据才能交给套接字处理;而客户端...
  • Ctrl_qun
  • Ctrl_qun
  • 2016年09月06日 22:13
  • 3913

Debug 运行正常但 Release 失败的问题,Debug 和 Release 编译方式的本质区别

经常在 CSDN 上看见有人问 Debug 运行正常但 Release 失败的问题。以往的讨论往往是经验性的,并没有指出会这样的真正原因是什么,要想找出真正的原因通常要凭运气。最近我看了一些这方面的书...
  • lck32578
  • lck32578
  • 2015年06月20日 22:39
  • 593

PROC--oracle中游标的使用

Oracle中的游标 Oracle使用两种游标: 显式游标和隐式游标.  不管语句返回多少条记录, Oracle为 每条使用的SQL语句隐式地定义一个游标. Oracle 为每个DELETE , ...
  • u012960623
  • u012960623
  • 2014年04月16日 12:06
  • 1905

linux中使用select和epoll确定异步connect连接是否成功

服务器开发中网络编程是一项基本技能也是重要的技能,在高并发socket编程中我们经常会使用到异步socket也就是非阻塞socket。下面记录下非阻塞socket中如何判断connect连接是否成。在...
  • m08090420
  • m08090420
  • 2016年07月31日 23:07
  • 2143

TCP解决connect函数的超时问题

在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未完成;同时TCP的三路握手操作继续进行;在这之后,我们可以调...
  • u014805066
  • u014805066
  • 2016年01月27日 10:26
  • 4651

网络编程Socket之TCP之connect详解

对TCP套接字调用connect会激发三次握手,如下: 客户端是主动打开连接的一端,会发送第一个SYN分节,然后等待确认,此时连接状态为SYN_SENT,当收到服务端的确认后...
  • junjun150013652
  • junjun150013652
  • 2014年07月19日 20:51
  • 4240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ProC血的教训!Connect失败也必须RELEASE!
举报原因:
原因补充:

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