proc oracle 連接釋放不了的問題
2024-08-29 13:54:03
供稿:網友
轉自:http://www.91linux.com/html/article/database/Oracle/20081205/14333.html
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;
}
注意,以上CONTEXT FREE 執行成功或者失敗,SQLCODE 都是0 !!!
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/workhardupc100/archive/2009/12/30/5108876.aspx