国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于嵌入式SQL的數(shù)據(jù)庫連接池應(yīng)用技術(shù)研究

2009-03-23 02:40
計(jì)算機(jī)時(shí)代 2009年1期
關(guān)鍵詞:多線程數(shù)據(jù)庫

潘 峰

摘要:設(shè)計(jì)了多線程數(shù)據(jù)庫應(yīng)用系統(tǒng),采用每個線程分配專用的運(yùn)行上下文機(jī)制,共享連接池中的若干個物理連接,以降低資源占用、提高系統(tǒng)性能。實(shí)驗(yàn)表明,使用連接池的系統(tǒng)的運(yùn)行速度遠(yuǎn)遠(yuǎn)優(yōu)于不使用連接池的運(yùn)行速度。

關(guān)鍵詞:多線程;連接池;運(yùn)行上下文;數(shù)據(jù)庫

0引言

在傳統(tǒng)的數(shù)據(jù)庫連接方式中,每一個數(shù)據(jù)庫連接對象均對應(yīng)一個物理數(shù)據(jù)庫連接,數(shù)據(jù)庫連接的建立以及關(guān)閉對系統(tǒng)而言是耗費(fèi)系統(tǒng)資源的操作。在多層體系結(jié)構(gòu)的應(yīng)用程序環(huán)境中,這種耗費(fèi)資源的動作對系統(tǒng)的性能影響尤為明顯。多層體系結(jié)構(gòu)的應(yīng)用程序通過連接池(Connection pooling)技術(shù)可以使系統(tǒng)的性能明顯得到提高。使用連接池意味著當(dāng)應(yīng)用程序需要調(diào)用一個數(shù)據(jù)庫連接時(shí),數(shù)據(jù)庫相關(guān)的接口將返回一個重用數(shù)據(jù)庫連接來代替重新創(chuàng)建一個數(shù)據(jù)庫連接。通過這種方式,應(yīng)用程序可以減少數(shù)據(jù)庫連接操作。特別是在多層環(huán)境中,多個客戶端可以通過共享少量的物理數(shù)據(jù)庫連接來滿足系統(tǒng)需求。使用連接池技術(shù)的數(shù)據(jù)庫應(yīng)用程序不僅可以提高系統(tǒng)性能,同時(shí)也提高了系統(tǒng)的可測量性。

1關(guān)鍵應(yīng)用技術(shù)

1.1PL/SQL

PL/SQL是ANSI標(biāo)準(zhǔn)SQL的Oracle版本過程化語言的擴(kuò)展。它允許嵌入SQL語句,支持變量定義、過程結(jié)構(gòu)以及異常處理機(jī)制等。在任何運(yùn)行Oracle的平臺中都可以使用PL/SQL。C/C++語言是開發(fā)高效率數(shù)據(jù)庫應(yīng)用程序的最佳語言。通過Oracle的預(yù)編譯工具Pro*C/C++,可在C/C++程序中內(nèi)嵌SQL語句和PL/SQL塊。當(dāng)應(yīng)用程序訪問RDBMS時(shí),每執(zhí)行一條SQL語句都要經(jīng)過一次網(wǎng)絡(luò),通過使用PL/SQL塊,將多條SQL語句組織到同一個PL/SQL塊中,可大大降低網(wǎng)絡(luò)開銷,進(jìn)而提高應(yīng)用性能,有利于開發(fā)高性能的應(yīng)用服務(wù)器。

1.2多線程

采用多線程的交互式應(yīng)用程序,提高了對用戶的響應(yīng)速度。運(yùn)行在現(xiàn)代PC機(jī)上的許多軟件包都是多線程的,為開發(fā)多線程應(yīng)用提供工具。多線程的優(yōu)點(diǎn)是能充分使用多處理器體系結(jié)構(gòu),以便每個線程能并行運(yùn)行在不同的處理器上,從而獲取強(qiáng)大的性能。

1.3數(shù)據(jù)庫連接池技術(shù)

連接池是指大量邏輯數(shù)據(jù)庫連接只使用了少量的物理數(shù)據(jù)庫連接。使用連接池的目的是為了提高性能,并降低資源占用。當(dāng)開發(fā)多線程應(yīng)用時(shí),如果不使用連接池,那么每個線程都將使用獨(dú)立的物理連接。

2應(yīng)用方案設(shè)計(jì)

2.1多線程應(yīng)用設(shè)計(jì)

多線程應(yīng)用是包含多個并發(fā)線程的數(shù)據(jù)庫應(yīng)用程序,線程共享數(shù)據(jù)庫應(yīng)用程序的地址空間、代碼段和數(shù)據(jù)段。對于同一進(jìn)程的所有線程來說,全局變量和靜態(tài)變量是公用的,操作系統(tǒng)使用互斥機(jī)制管理線程對這些變量的訪問。

2.1.1運(yùn)行上下文

開發(fā)多線程數(shù)據(jù)庫應(yīng)用時(shí),為了將線程和數(shù)據(jù)庫連接有效地結(jié)合起來,Pro*C/C++提供了運(yùn)行上下文(Runtime Context)。當(dāng)編寫源程序時(shí),可采用兩種方式使用運(yùn)行上下文:一種是多個線程使用互斥機(jī)制共享同一個運(yùn)行上下文,另一種是不同線程使用專用的運(yùn)行上下文。

2.1.2關(guān)鍵SQL語句

多線程應(yīng)用程序設(shè)計(jì)需要內(nèi)嵌SQL語句激活多線程支持,并用內(nèi)嵌SQL語句支持運(yùn)行上下文。

1.EXEC SOL ENABLE THREADS該內(nèi)嵌SQL語句用于初始化支持多線程應(yīng)用的進(jìn)程,激活多線程支持。它是多線程應(yīng)用的第一條內(nèi)嵌SQL語句。

2.EXEC SQL CONTEXT ALLOCATE:var_context該內(nèi)嵌語句用于初始化運(yùn)行上下文變量、分配內(nèi)存空間。Pro*C/C++使用偽數(shù)據(jù)類型SQL_CONTEXT定義運(yùn)行上下文變量,其中變量名必須全部用大寫格式或全部用小寫格式,不能大小寫混合。

3.EXEC SOL CONTEXT USE:var_context該內(nèi)嵌語句用于指定線程要使用的運(yùn)行上下文。

4.EXEC SQL CONTEXT FREE:var_context該內(nèi)嵌語句用于釋放運(yùn)行上下文所占用的內(nèi)存空間。

2.2連接池應(yīng)用

2.2.1使用連接池特征

不使用連接池情形如圖1所示,10個線程需要分配10個物理連接,從而會占用大量服務(wù)器資源,并增加多線程應(yīng)用的運(yùn)行時(shí)間。

采用連接池的情形如圖2所示,多個線程共享連接池中的三個物理連接,大大降低了服務(wù)器資源的占用,并提高了應(yīng)用運(yùn)行性能。

2.2.2連接池頓編譯選項(xiàng)

CPOOL:用于激活或禁用連接池,默認(rèn)為NO。設(shè)置為YES,激活連接池特征。

CMAX:用于指定打開的最大物理連接個數(shù),默認(rèn)值為100。

CMIN:用于指定打開的最小物理連接個數(shù),默認(rèn)值為2。

CINCR:用于指定連接池每次要增加的物理連接個數(shù),默認(rèn)值為1。

cTIMEOUT:用于指定超時(shí)值,若物理連接空閑時(shí)間超出該值,則從連接池中終止該物理連接。

CNOWAIT:用于指定最大物理連接個數(shù)都處于繁忙狀態(tài)時(shí)重試物理連接的次數(shù)。

2.3部分關(guān)鍵實(shí)現(xiàn)代碼

#include

#include<sqlda.h>

#define THREADS 20

EXEC SQL BEGIN DECLARE SECTION;

typedef struct{

sql_contextctx;

int threadld;

)parameters;

VARCHAR usemame[20],password[20].servername[20];

int empCount;

EXEC SQL END DECLARE SECTION;

void sqlError(struct sqlca);

void Iogon(sql_context):

void Iogoff(sql_context);

void do_action(parameters*);

SYSTEMTIME tp1,tp2;

InI main() (

int i.timeTaken=0;

EXEC SQL BEGIN DECLARE SECTION;

sql_eontext ctx[THREADS];

HANDLE thread[THREADS];

parameters params [THREADS]:

DWORD Threadld[THREADS]:

EXEC SQL ENABLE THREADS;

Ioginlnit(“usrname”,“pwd”,“sewer”):

GetSystemTime(&tp1):

for(i=0;i<THREADS;i++)(

EXEC SQL CONTEXT ALLOCATE:ctx[i]:

Iogon(ctx[i]);

}//分配若干運(yùn)行上下文,并建立連接

for(i=0;i

parsms[i].cIx=ctx[i]:

params[i].threadlD=i;

thrsad[i]=CreateThread(NULL,0,

(LPTHREAD_START_ROUTINE)do_action,&params[i],0,

&Threadld[i]);

}//創(chuàng)建若干線程

GetSystemTime=(&tp2):

for(i=0;i

if(WatiForSingleO Dject(thread[i],IINFINITE)

==WAIT_OBJECT_0)logoff(ctx[i]):

EXEC SQL CONTEXT FREE:ctx[i]:

}//終止所有線程

timeTaken=(tp2.wMinute-tp1.wMinute).60000;

timeTaken+=(tp2.wSecond-tpl.wSecond) 1000;

timeTaken+=tp2.wMilliseconds-tp1.wMUliseconds):

printf(“執(zhí)行時(shí)間:%fs ”,timeTaken/1000.0);

retum 0:

實(shí)驗(yàn)分為兩種情形:

情形一,不使用連接池,預(yù)編譯指令為:pmc c:demo est.pc threads=y(tǒng)es

情形二,使用連接池,預(yù)編譯指令為:proc c:demo est.pcthreads=y(tǒng)es cpool=y(tǒng)es上述二種情形運(yùn)行時(shí)間分別為5.988秒和0.872秒,使用連接池的運(yùn)行速度遠(yuǎn)優(yōu)于不使用連接池的速度。

3實(shí)驗(yàn)開發(fā)環(huán)境

實(shí)驗(yàn)的應(yīng)用開發(fā)環(huán)境是在Window XP系統(tǒng)下將預(yù)編譯器Pro*c/C++、Intel C++9.0編譯器集成到Visual C++6.0中。后臺數(shù)據(jù)庫采用Oracle公司的Oracle 9i數(shù)據(jù)庫管理系統(tǒng)。硬件環(huán)境為奔騰雙核1.6G處理器和1.5GB內(nèi)存。

4結(jié)束語

應(yīng)用程序采用多線程,提高了用戶請求的響應(yīng)速度。特別是高性能應(yīng)用服務(wù)器的開發(fā),能充分利用多處理器體系結(jié)構(gòu),使每個線程并行運(yùn)行在不同的處理器上。采用數(shù)據(jù)庫連接池技術(shù),則可降低系統(tǒng)開銷,有效地提高系統(tǒng)性能。

猜你喜歡
多線程數(shù)據(jù)庫
Java并發(fā)工具包對并發(fā)編程的優(yōu)化
基于多線程文件傳輸關(guān)鍵技術(shù)研究與實(shí)現(xiàn)
網(wǎng)頁爬蟲技術(shù)的關(guān)鍵技術(shù)研究探索
一種基于多線程的高速磁盤鏡像算法
iOS并發(fā)程序設(shè)計(jì)中幾種方法的特點(diǎn)及使用技巧研究
胶南市| 吕梁市| 凤阳县| 太湖县| 会宁县| 宁南县| 中牟县| 金平| 莱州市| 银川市| 梅河口市| 阳西县| 潞西市| 武威市| 白河县| 天祝| 宝坻区| 巴里| 高平市| 双峰县| 平果县| 唐河县| 长汀县| 静乐县| 本溪市| 林芝县| 松溪县| 保山市| 临海市| 伊吾县| 霞浦县| 民勤县| 武川县| 乐昌市| 南皮县| 防城港市| 和平区| 涿鹿县| 轮台县| 榕江县| 嘉祥县|