Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65416
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-10 09:58
个人简介

专业提供linux应用软件开发、oracle数据库底层开发,服务器开发及相关技术支持服务

文章分类

全部博文(24)

文章存档

2015年(24)

我的朋友

分类: LINUX

2015-02-13 10:34:27

项目开发中,对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], [], [], [], [], [], [], []


----- Call Stack Trace -----


----- Call Stack Trace -----
calling              call     entry                argument values in hex      
location             type     point                (? means dubious value)     
-------------------- -------- -------------------- ----------------------------
calling              call     entry                argument values in hex      
location             type     point                (? means dubious value)     
-------------------- -------- -------------------- ----------------------------
skgudmp+0044         bl       kgdsdst              7C0 ? A00D5498 ?

在网上查阅资料,发现基本都是应用程序多线程使用连接池对数据库操作导致的(从软件开发方向)。大家可以看下这篇文章,主要从编译解决(http://ah-fu.iteye.com/blog/281552)。

     我们软件开发确实是多线程使用连接池对数据库操作。软件启动时,根据配置来创建多个线程,每个线程对应一个RAC,每个RAC使用一个连接池,所以在软件启动时,会创建一个数据库连接池。每一个线程在对数据库操作时,会先检测本线程对应的连接是否连接,然后根据连接再对数据库执行操作。单个线程在执行时没有问题,但是多个线程执行时就会出现core dump

有的解决方案时在编译时去掉关于对连接池的选项,本案没有按着这个方法,而是既然问题出现在多线程使用连接池对数据库操作时,那就创建尽量少的连接个数,并且在数据库连接,检查连接,对数据库操作时都加锁,使其成为原子操作,这样代码修改完毕后,再测试就没再出现ocre dumpBUG,而且在ASMRAC模式下,读取日志文件时也不再出现读取失败BUG,整个软件正常在oracle10G-ASMRAC模式下工作。

 


阅读(1718) | 评论(0) | 转发(0) |
0

上一篇:字节对其小结

下一篇:oracle 体系结构(二)

给主人留下些什么吧!~~