国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 潼南县| 湛江市| 新化县| 永顺县| 隆安县| 莱芜市| 安义县| 白银市| 龙州县| 雷波县| 古交市| 浦城县| 会昌县| 芜湖市| 漳浦县| 扶风县| 阿坝县| 嘉禾县| 绵竹市| 即墨市| 遂宁市| 榆中县| 汝阳县| 新和县| 双鸭山市| 讷河市| 济阳县| 象山县| 兴和县| 淳安县| 龙江县| 聂拉木县| 南平市| 视频| 左贡县| 墨竹工卡县| 白沙| 湖南省| 绵竹市| 乐昌市| 武夷山市|