作业帮 > Oracle > 教育资讯

Oracle教程:proc oracle 连接释放不了的问题

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/28 17:42:40 Oracle
Oracle教程:proc oracle 连接释放不了的问题
Oracle教程:proc oracle 连接释放不了的问题Oracle
【51test.NET-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; 
} Oracle