标题 | 基于嵌入式SQL的数据库连接池应用技术研究 |
范文 | 潘 峰 摘要:设计了多线程数据库应用系统,采用每个线程分配专用的运行上下文机制,共享连接池中的若干个物理连接,以降低资源占用、提高系统性能。实验表明,使用连接池的系统的运行速度远远优于不使用连接池的运行速度。 关键词:多线程;连接池;运行上下文;数据库 0引言 在传统的数据库连接方式中,每一个数据库连接对象均对应一个物理数据库连接,数据库连接的建立以及关闭对系统而言是耗费系统资源的操作。在多层体系结构的应用程序环境中,这种耗费资源的动作对系统的性能影响尤为明显。多层体系结构的应用程序通过连接池(Connection pooling)技术可以使系统的性能明显得到提高。使用连接池意味着当应用程序需要调用一个数据库连接时,数据库相关的接口将返回一个重用数据库连接来代替重新创建一个数据库连接。通过这种方式,应用程序可以减少数据库连接操作。特别是在多层环境中,多个客户端可以通过共享少量的物理数据库连接来满足系统需求。使用连接池技术的数据库应用程序不仅可以提高系统性能,同时也提高了系统的可测量性。 1关键应用技术 1.1PL/SQL PL/SQL是ANSI标准SQL的Oracle版本过程化语言的扩展。它允许嵌入SQL语句,支持变量定义、过程结构以及异常处理机制等。在任何运行Oracle的平台中都可以使用PL/SQL。C/C++语言是开发高效率数据库应用程序的最佳语言。通过Oracle的预编译工具Pro*C/C++,可在C/C++程序中内嵌SQL语句和PL/SQL块。当应用程序访问RDBMS时,每执行一条SQL语句都要经过一次网络,通过使用PL/SQL块,将多条SQL语句组织到同一个PL/SQL块中,可大大降低网络开销,进而提高应用性能,有利于开发高性能的应用服务器。 1.2多线程 采用多线程的交互式应用程序,提高了对用户的响应速度。运行在现代PC机上的许多软件包都是多线程的,为开发多线程应用提供工具。多线程的优点是能充分使用多处理器体系结构,以便每个线程能并行运行在不同的处理器上,从而获取强大的性能。 1.3数据库连接池技术 连接池是指大量逻辑数据库连接只使用了少量的物理数据库连接。使用连接池的目的是为了提高性能,并降低资源占用。当开发多线程应用时,如果不使用连接池,那么每个线程都将使用独立的物理连接。 2应用方案设计 2.1多线程应用设计 多线程应用是包含多个并发线程的数据库应用程序,线程共享数据库应用程序的地址空间、代码段和数据段。对于同一进程的所有线程来说,全局变量和静态变量是公用的,操作系统使用互斥机制管理线程对这些变量的访问。 2.1.1运行上下文 开发多线程数据库应用时,为了将线程和数据库连接有效地结合起来,Pro*C/C++提供了运行上下文(Runtime Context)。当编写源程序时,可采用两种方式使用运行上下文:一种是多个线程使用互斥机制共享同一个运行上下文,另一种是不同线程使用专用的运行上下文。 2.1.2关键SQL语句 多线程应用程序设计需要内嵌SQL语句激活多线程支持,并用内嵌SQL语句支持运行上下文。 1.EXEC SOL ENABLE THREADS该内嵌SQL语句用于初始化支持多线程应用的进程,激活多线程支持。它是多线程应用的第一条内嵌SQL语句。 2.EXEC SQL CONTEXT ALLOCATE:var_context该内嵌语句用于初始化运行上下文变量、分配内存空间。Pro*C/C++使用伪数据类型SQL_CONTEXT定义运行上下文变量,其中变量名必须全部用大写格式或全部用小写格式,不能大小写混合。 3.EXEC SOL CONTEXT USE:var_context该内嵌语句用于指定线程要使用的运行上下文。 4.EXEC SQL CONTEXT FREE:var_context该内嵌语句用于释放运行上下文所占用的内存空间。 2.2连接池应用 2.2.1使用连接池特征 不使用连接池情形如图1所示,10个线程需要分配10个物理连接,从而会占用大量服务器资源,并增加多线程应用的运行时间。 采用连接池的情形如图2所示,多个线程共享连接池中的三个物理连接,大大降低了服务器资源的占用,并提高了应用运行性能。 2.2.2连接池顿编译选项 CPOOL:用于激活或禁用连接池,默认为NO。设置为YES,激活连接池特征。 CMAX:用于指定打开的最大物理连接个数,默认值为100。 CMIN:用于指定打开的最小物理连接个数,默认值为2。 CINCR:用于指定连接池每次要增加的物理连接个数,默认值为1。 cTIMEOUT:用于指定超时值,若物理连接空闲时间超出该值,则从连接池中终止该物理连接。 CNOWAIT:用于指定最大物理连接个数都处于繁忙状态时重试物理连接的次数。 2.3部分关键实现代码 #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]); }//分配若干运行上下文,并建立连接 for(i=0;i parsms[i].cIx=ctx[i]: params[i].threadlD=i; thrsad[i]=CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)do_action,¶ms[i],0, &Threadld[i]); }//创建若干线程 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(“执行时间:%fs”,timeTaken/1000.0); retum 0: } 实验分为两种情形: 情形一,不使用连接池,预编译指令为:pmc c:demo est.pc threads=yes 情形二,使用连接池,预编译指令为:proc c:demo est.pcthreads=yes cpool=yes上述二种情形运行时间分别为5.988秒和0.872秒,使用连接池的运行速度远优于不使用连接池的速度。 3实验开发环境 实验的应用开发环境是在Window XP系统下将预编译器Pro*c/C++、Intel C++9.0编译器集成到Visual C++6.0中。后台数据库采用Oracle公司的Oracle 9i数据库管理系统。硬件环境为奔腾双核1.6G处理器和1.5GB内存。 4结束语 应用程序采用多线程,提高了用户请求的响应速度。特别是高性能应用服务器的开发,能充分利用多处理器体系结构,使每个线程并行运行在不同的处理器上。采用数据库连接池技术,则可降低系统开销,有效地提高系统性能。 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。