用ProC开发多线程应用程序-数据库专家.doc

上传人:博****1 文档编号:557229851 上传时间:2023-01-11 格式:DOC 页数:7 大小:33.52KB
返回 下载 相关 举报
用ProC开发多线程应用程序-数据库专家.doc_第1页
第1页 / 共7页
用ProC开发多线程应用程序-数据库专家.doc_第2页
第2页 / 共7页
用ProC开发多线程应用程序-数据库专家.doc_第3页
第3页 / 共7页
用ProC开发多线程应用程序-数据库专家.doc_第4页
第4页 / 共7页
用ProC开发多线程应用程序-数据库专家.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《用ProC开发多线程应用程序-数据库专家.doc》由会员分享,可在线阅读,更多相关《用ProC开发多线程应用程序-数据库专家.doc(7页珍藏版)》请在金锄头文库上搜索。

1、用Pro*C开发多线程应用程序-数据库专家代码: (注:本文来自Pro*C/C+ Precompiler Programmers Guide Release 8.1.5)如果你的操作系统不支持线程,本文暂不适合你。本文包含以下几个部分:n 什么是多线程?n Pro*C中的运行时上下文n 运行时上下文的使用模式n 多线程应用程序的用户接口n 多线程例子一什么是多线程? 一个多线程的应用程序中,线程运行在共享的地址空间里。线程是在进程内部执行的“轻量”级子进程,它们共享代码段和数据段,但是有自己的程序计数器、寄 存器和堆栈。全局变量和静态变量在线程之间是共享的,因此通常需要在程序中使用某种互斥机制

2、来管理线程对这些变量的访问,互斥体Mutexes就是用来保 证数据完整性的同步装置。有关互斥体的更多讨论,参看多线程编程方面的文章。Proc*C编译器通过以下方式支持开发多线程的Oracle应用程序(在支持线程的平台上):n 用一个命令行编译选项来产生线程安全的代码n 用内嵌的SQL语句和指令支持多线程n 线程安全的Lib库和其他客户端Lib库注意:也许你的平台支持某个特殊的线程包,但还是需要查看Oracle有关平台的文档,看看Oracle是否支持它。二Pro*C中的运行时上下文为了在线程和数据库连接之间建立松散的结合,Pro*C引入了一个概念runtime_context,我们称之为运行时上

3、下文。一个运行时上下文包含了以下资源和信息:n 与数据库服务器的连接n 当前连接上使用的游标n 内嵌的一些选项,如MODE,HOLD_CURSOR,RELEASE_CURSOR和 SELECT_ERROR不仅仅是简单的支持线程和连接之间的松散结合,Pro*C编译器还允许开发人员在线程和运行时上下文之间建立松散的结合,Pro*C允许在程序里为运行时上下文定义一个句柄,通过这个句柄,运行时上下文可以在线程之间切换。例如,一个交互式应用程序创建了线程T1,来执行一个查询,并且返回了前10条记录,然后T1终止。在用户输入了必须的数据之后,程序又创建了线程T2,并且把T1使用的运行时上下文传给T2,这样

4、T2可以在同一个游标上获取接下来10条的记录。三运行时上下文的使用模式下面是在多线程的Pro*C程序中使用运行时上下文的两种可能模式:n 多线程共享单个运行时上下文n 多线程使用互相独立的运行时上下文不管采用哪种模式,不能在同一时刻多个线程共享同一个运行时上下文。如果两个或两个以上的线程在同一时刻试图使用同一个运行时上下文,将会出现以下错误:SQL-02131: Runtime context in use。1多线程共享单个运行时上下文2多线程使用互相独立的运行时上下文四多线程应用程序的用户接口Pro*C编译器提供以下接口来支持多线程:n 命令行选项,THREADS=YES|NOn 内嵌SQL

5、语句和指令n 线程安全的公共库函数1THREADS选项 在proc预编译命令行上指定THREADS=YES,Pro*C编译器将保证产生的C代码是线程安全的。如果指定了THREADS=YES, Pro*C将会检查每个包含SQL执行语句的函数,是否指定了这些语句是在哪个运行时上下文中执行的,若没有发现这类指定标识,编译器就会返回错误。2内嵌SQL语句和指令下列内嵌的SQL语句和指令用于支持多线程和运行时上下文的使用:n EXEC SQL ENABLE THREADS;n EXEC SQL CONTEXT ALLOCATE :context_var;n EXEC SQL CONTEXT USE :c

6、ontext_var/DEFAULT;n EXEC SQL CONTEXT FREE :context_var;在以上SQL语句中,context_var是运行时上下文句柄,它必须被定义成sql_context类型:如sql_context context_var;使用DEFAULT意味着接下来的SQL语句将使用默认的全局运行时上下文,直到另一条CONTEXT USE语句覆盖它。n EXEC SQL ENABLE THREADS这条可执行SQL语句初始化支持多线程的进程。它必须是程序中第一条可执行的SQL语句。n EXEC SQL CONTEXT ALLOCATE这条可执行SQL语句分配并初始

7、化了一块用于指向一个新的运行时上下文的内存,并返回标识该上下文的句柄变量,该变量必须声明为sql_context类型。n EXEC SQL CONTEXT USE这条指令性语句告诉编译器接下去执行的SQL语句将使用指定的运行时上下文,这里的运行时上下文必须在此前已经用CONTEXT ALLOCATE分配并初始化。n EXEC SQL CONTEXT FREE这条语句释放了运行时上下文句柄指定的内存,并把它设置空值。3编程时要考虑的问题尽管Oracle保证SQL库是线程安全的,但是你还是有责任保证你的Pro*C代码是为能在多线程下正确运行而设计的,例如,你必须考虑全局变量和静态变量的。另外,多线

8、程要求对以下问题进行考虑:n 把sqlca结构定义成线程安全的。典型的做法是在每个函数开始定义一个同名的局部变量。n sqlda结构也和sqlca结构一样处理。n 把程序里的宿主变量定义成线程安全的。也就是说要小心处理程序里的全局变量和静态变量。n 避免同一时刻不同线程使用同一个运行时上下文。五多线程例子下面的例子运行在Red Hat9和Oracle9上。程序目的是用两个线程同时往一个表里插10000条记录,每个线程都拥有自己的运行时上下文。#include#include#include /* Linux线程库头文件 */#include sqlca.h /* Oracle头文件 */#de

9、fine SQLCODE sqlca.sqlcodestatic int insert_data( sql_context );static int start();intmain()pthread_t tid1, tid2;/* 创建两个线程 */if( pthread_create( &tid1,NULL,(void *)start,NULL ) )printf( 创建线程失败!n );exit(1);if( pthread_create( &tid2,NULL,(void *)start,NULL ) )printf( 创建线程失败!n );exit(1);/* 等待线程退出 */if(

10、 pthread_join( tid1,NULL ) )printf( 等待线程结束失败!n );exit(1);if( pthread_join( tid2,NULL ) )printf( 等待线程结束失败!n );exit(1);exit(0);intstart()sql_context context;struct sqlca sqlca; /* 需要在此定义一个局部的sqlca */char uid = dev/888888;/* 以下SQL语句的执行顺序不能更改 */EXEC SQL ENABLE THREADS;EXEC SQL CONTEXT ALLOCATE :context;

11、EXEC SQL CONTEXT USE :context;EXEC SQL CONNECT :uid;if( SQLCODE 0 )printf( 创建数据库连接失败,%d:%sn, SQLCODE,sqlca.sqlerrm.sqlerrmc);return -1;insert_data( context );EXEC SQL COMMIT WORK RELEASE;if( SQLCODE 0 )printf( 断开数据库连接失败!%d:%sn, SQLCODE,sqlca.sqlerrm.sqlerrmc );return -1;EXEC SQL CONTEXT FREE :contex

12、t;return 0;static intinsert_data( context )sql_context context;struct sqlca sqlca; /* 需要在此定义一个局部的sqlca */char name11;int age;int i;strcpy( name, test );age = 20;EXEC SQL CONTEXT USE :context; /* 指定执行SQL语句的上下文 */for( i=0; i10000; i+ )EXEC SQL INSERT INTO table1 VALUES ( :name, :age );if( SQLCODE 0 )printf( 插入纪录失败!%d:%sn, SQLCODE, sqlca.sqlerrm.sqlerrmc );return -1;return 0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号