多线程使用连接池对数据库操作出现core dumpBUG以及解决方法
项目开发中,对oracle数据库操作使用了oracle公司开发的OCILIB库。在整个软件架构(抓取进程)设计中,采用了单进程多线程模式开发,整个开发过程中没有考虑oracle数据库连接池问题,而且在oracle11G多RAC模式下,软件一直都是正常工作。但是在AIX系统下oracle10g多RAC模式下,软件就连基本的启动都出现了BUG。软件每次启动都报oci—21500错误,整个软件出现core dump现象。具体如下:OCI-21500: internal error code, arguments: [17099], [], [], [], [], [], [], []OCI-21500: internal error code, arguments: [17099], [], [], [], [], [], [], []
OCI-21500: internal error code, arguments: [17099], [], [], [], [], [], [], []
OCI-21500: internal error code, arguments: [17099], [], [], [], [], [], [], []
Errors in file :
OCI-21500: internal error code, arguments: [17099], [], [], [], [], [], [], []
OCI-21500: internal error code, arguments: [17099], [], [], [], [], [], [], []
Errors in file :
OCI-21500: internal error code, arguments: [17099], [], [], [], [], [], [], []
OCI-21500: internal error code, arguments: [17099], [], [], [], [], [], [], []
在网上查阅资料,发现基本都是应用程序多线程使用连接池对数据库操作导致的(从软件开发方向)。大家可以看下这篇文章,主要从编译解决(http://ah-fu.iteye.com/blog/281552]http://ah-fu.iteye.com/blog/281552)。 我们软件开发确实是多线程使用连接池对数据库操作。软件启动时,根据配置来创建多个线程,每个线程对应一个RAC,每个RAC使用一个连接池,所以在软件启动时,会创建一个数据库连接池。每一个线程在对数据库操作时,会先检测本线程对应的连接是否连接,然后根据连接再对数据库执行操作。单个线程在执行时没有问题,但是多个线程执行时就会出现core dump。有的解决方案时在编译时去掉关于对连接池的选项,本案没有按着这个方法,而是既然问题出现在多线程使用连接池对数据库操作时,那就创建尽量少的连接个数,并且在数据库连接,检查连接,对数据库操作时都加锁,使其成为原子操作,这样代码修改完毕后,再测试就没再出现ocre dumpBUG,而且在ASM多RAC模式下,读取日志文件时也不再出现读取失败BUG,整个软件正常在oracle10G-ASM多RAC模式下工作。