您现在的位置: 首页  > Oracle > 基础知识
通行证登录
 

proc oracle 连接释放不了的问题

作者:[网上资料 ]
PRoc oracle 连接释放不了的问题笔者公司的应用系统每隔一段时间,oracle连接就达到上限了;怀疑是应用没有正确的释放oracle连接;说来惭愧,proc断断续续的用了几年,可能是以前公司的代码写得太好了,从没有去关心基本的proc连接、释放是怎么处理的,这问题逼得我得去熟悉这方面的东西了;弄了两天才找到问题的根源,其中大半时间是熟悉原系统的代码、定位问题,其他时间是找网上的资料看、做相关的测试; 经过分析,将问题定位在了数据库打开、关闭的相关函数;后台c++应用的根本没有成功的释放oracle 连接,数据库操作函数如下: sql_context db_open(const char* usr, const char* pwd) { EXEC SQL BEGIN DECLARE SECTION; sql_context ctx; char username[64]; char passwd[64]; EXEC SQL END DECLARE SECTION; struct sqlca sqlca; EXEC SQL ENABLE THREADS; EXEC SQL CONTEXT ALLOCATE :ctx; EXEC SQL CONTEXT USE :ctx; strcpy(username,usr); strcpy(passwd,pwd); EXEC SQL CONNECT :username IDENTIFIED BY :passwd; if (sqlca.sqlcode) { printf( "连接oracle数据库失败!"); return NULL; } return ctx; } int db_close(sql_context ctx) { struct sqlca sqlca; EXEC SQL CONTEXT FREE :ctx; if( SQLCODE != 0 ) { printf( "断开数据库连接失败!%d:%s\n",SQLCODE,sqlca.sqlerrm.sqlerrmc ); return -1; } return 0; } 经过测试,发现以上db_close根本没有释放数据库连接;经过和网上示范程序的对比,终于发现了问题: 原来oracle 的sql context,需要 release之后,才能正确释放数据库连接;如果不做release,free context不会报任何错误(即db_close中并不返回-1),但是数据库连接却不会释放(对oracle的这个处理机制,汗一个-_-|||,或者说明我的proc比较弱吧,可能还有别的解决办法); 把db_close改成如下,问题解决: int db_close(sql_context ctx) { struct sqlca sqlca; EXEC SQL CONTEXT USE :ctx; EXEC SQL COMMIT WORK RELEASE; EXEC SQL CONTEXT FREE :ctx; if( SQLCODE != 0 ) { printf( "断开数据库连接失败!%d:%s\n",SQLCODE,sqlca.sqlerrm.sqlerrmc ); return -1; } return 0; } |