OCI編程高級篇(十九) 創(chuàng)建和使用OCI連接池
訪問www.tomcoding.com網(wǎng)站,學(xué)習(xí)Oracle內(nèi)部數(shù)據(jù)結(jié)構(gòu),詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學(xué)習(xí)高技術(shù)含量的內(nèi)容。
上一節(jié)介紹了連接池的概念和使用連接池的步驟,這一節(jié)看看具體的操作是怎樣的,先看一下用到的函數(shù)原型和參數(shù)。
創(chuàng)建連接池函數(shù)OCIConnectionPoolCreate(),原型和參數(shù)如下。
sword OCIConnectionPoolCreate ( OCIEnv *envhp,
OCIError *errhp,
OCICPool *poolhp,
OraText **poolName,
sb4 *poolNameLen,
const OraText *dblink,
sb4 dblinkLen,
ub4 connMin,
ub4 connMax,
ub4 connIncr,
const OraText *poolUsername,
sb4 poolUserLen,
const OraText *poolPassword,
sb4 poolPassLen,
ub4 mode );
envhp是一個輸入?yún)?shù),OCI環(huán)境句柄。
errhp是一個輸入/輸出參數(shù),錯誤句柄,返回錯誤碼和錯誤信息文本。
poolhp是一個輸入?yún)?shù),連接池句柄,調(diào)用函數(shù)前要先分配一個,父句柄是envhp。
poolName是一個輸出參數(shù),返回連接池的名稱,后面的函數(shù)會用到。
poolNameLen是一個輸出參數(shù),返回連接池名稱的長度,后面的函數(shù)會用到。
dblink是一個輸入?yún)?shù),連接數(shù)據(jù)庫的連接字符串,可以是TNS名稱。
dblinkLen是一個輸入?yún)?shù),連接字符串的長度。
connMin是一個輸入?yún)?shù),與后面的兩個參數(shù)一起決定連接池到數(shù)據(jù)庫的連接個數(shù),這個是連接池創(chuàng)建時與數(shù)據(jù)庫建立的最小連接數(shù),最小可以是0,有用戶請求時再創(chuàng)建。
connMax是一個輸入?yún)?shù),限制連接池與數(shù)據(jù)庫的最大連接數(shù)。
connIncr是一個輸入?yún)?shù),表示連接達到最小值,有新連接請求時每次增長的連接個數(shù)。
poolUsername是一個輸入?yún)?shù),連接池會隱含的開啟一個與數(shù)據(jù)庫的會話,這是會話認證時的用戶名稱。
poolUserLen是一個輸入?yún)?shù),認證用戶名稱的長度。
poolPassword是一個輸入?yún)?shù),認證用戶的密碼。
poolPassLen是一個輸入?yún)?shù),密碼長度。
mode是一個輸入?yún)?shù),一般選擇OCI_DEFAULT。
獲取連接池的會話函數(shù),有兩個可用一個是OCILogon2(),另一個是OCISessionGet()。先看第一個。
sword OCILogon2 ( OCIEnv *envhp,
OCIError *errhp,
OCISvcCtx **svchp,
const OraText *username,
ub4 uname_len,
const OraText *password,
ub4 passwd_len,
const OraText *dbname,
ub4 dbname_len );
ub4 mode );
envhp是一個輸入?yún)?shù),OCI環(huán)境句柄。
errhp是一個輸入/輸出參數(shù),錯誤句柄,返回錯誤碼和錯誤信息文本。
svchp是一個輸入/輸出參數(shù),服務(wù)上下文句柄。這個句柄不需要分配,OCI會自動分配這個句柄,函數(shù)還會自動分配一個服務(wù)器句柄和開啟一個會話句柄,并且把這兩個句柄設(shè)置到服務(wù)上下文句柄的屬性中。
username是一個輸入?yún)?shù),用于會話認證的用戶名。
uname_len是一個輸入?yún)?shù),認證用戶的長度。
password是一個輸入?yún)?shù),認證用戶的密碼。
passwd_len是一個輸入?yún)?shù),認證密碼長度。
dbname是一個輸入?yún)?shù),在這里要輸入連接池的名稱。
dbname_len是一個輸入?yún)?shù),連接池名稱的長度。
mode是一個輸入?yún)?shù),這里要選擇OCI_LOGON2_CPOOL。
另一個函數(shù)是OCISessionGet(),這個函數(shù)傳入一個認證信息句柄,可以更細致的控制認證過程。
sword OCISessionGet ( OCIenv *envhp,
OCIError *errhp,
OCISvcCtx **svchp,
OCIAuthInfo *authInfop,
OraText *dbName,
ub4 dbName_len,
const OraText *tagInfo,
ub4 tagInfo_len,
OraText **retTagInfo,
ub4 *retTagInfo_len,
boolean *found,
ub4 mode );
envhp是一個輸入/輸出參數(shù),OCI環(huán)境句柄。
errhp是一個輸入/輸出參數(shù),錯誤句柄,返回錯誤碼和錯誤信息文本。
svchp是一個輸入?yún)?shù),服務(wù)上下文句柄。這個句柄不需要分配,OCI會自動分配這個句柄,函數(shù)還會自動分配一個服務(wù)器句柄和開啟一個會話句柄,并且把這兩個句柄設(shè)置到服務(wù)上下文句柄的屬性中。
authInfop是一個輸入?yún)?shù),認證信息句柄,要預(yù)先分配,父句柄是envhp,使用OCI_HTYPE_AUTHINFO類型,分配句柄后要設(shè)置認證用戶和密碼的屬性。
dbName是一個輸入?yún)?shù),連接池名稱,創(chuàng)建連接池時返回。
dbName_len是一個輸入?yún)?shù),連接池名稱長度。
tagInfo是一個輸入?yún)?shù),會話標簽信息,只用于會話池的參數(shù),設(shè)置為NULL。
tagInfo_len是一個輸入?yún)?shù),會話標簽信息長度。
retTagInfo是一個輸出參數(shù),返回的會話標簽信息,指示會話的類型,只用于會話池的參數(shù),設(shè)置為NULL。
retTagInfo_len是一個輸出參數(shù),返回的會話標簽信息長度。
found是一個輸出參數(shù)。用于會話池的參數(shù),設(shè)置為NULL。
mode是一個輸入?yún)?shù),取值OCI_SESSGET_CPOOL。
前面是創(chuàng)建連接池和獲取會話的函數(shù),中間可以通過會話執(zhí)行數(shù)據(jù)庫操作的其他OCI函數(shù)。后面是釋放會話和刪除連接池的函數(shù)。
如果前面用了OCILogon2()函數(shù)來取得會話,那么要用OCILogoff()函數(shù)來釋放會話。
sword OCILogoff ( OCISvcCtx *svchp, OCIError *errhp );
svchp是一個輸入?yún)?shù),服務(wù)上下文句柄,從OCILogon2()函數(shù)中返回的句柄。
errhp是一個輸入/輸出參數(shù),錯誤句柄,返回錯誤碼和錯誤信息文本。
如果前面使用了OCISessionGet()函數(shù)來獲取會話,那么要用OCISessionRelease()函數(shù)來釋放會話。
sword OCISessionRelease ( OCISvcCtx *svchp,
OCIError *errhp,
OraText *tag,
ub4 tag_len,
ub4 mode );
svchp是一個輸入?yún)?shù),服務(wù)上下文句柄,從OCISessionGet()函數(shù)中返回的句柄。
errhp是一個輸入/輸出參數(shù),錯誤句柄,返回錯誤碼和錯誤信息文本。
tag是一個輸入?yún)?shù),只用于會話池的參數(shù),設(shè)置為NULL。
tag_len是一個輸入?yún)?shù),只用于會話池的參數(shù),設(shè)置為0。
mode是一個輸入?yún)?shù),取值OCI_DEFAULT。
刪除掉連接池,函數(shù)為OCIConnectionPoolDestroy(),原型和參數(shù)如下。
sword OCIConnectionPoolDestroy ( OCICPool *poolhp,
OCIError *errhp,
ub4 mode );
poolhp是一個輸入?yún)?shù),連接池句柄,與創(chuàng)建時的一致。
errhp是一個輸入/輸出參數(shù),錯誤句柄,返回錯誤碼和錯誤信息文本。
mode是一個輸入?yún)?shù),取值OCI_DEFAULT。
上面這些就是使用連接池時用到的函數(shù),其他一些分配句柄函數(shù)OCIHandleAlloc()和設(shè)置屬性函數(shù)OCIAttrSet()已經(jīng)在前面介紹過了,這里從略。
下一節(jié)我們寫一段代碼,來看看使用連接池的整個過程。

浙公網(wǎng)安備 33010602011771號