日历

« 2008-07-09  
  12345
6789101112
13141516171819
20212223242526
2728293031  

RSS订阅

我是一匹静静奔跑的骏马\r\n ~~~~~~~~~~~~~~~~~~~\r\n in doing we learn!\r\n ~~~~~~~~~~~~~~~~~~~\r\n

多线程pro*c设计

2007-08-22 14:51:39

Pro*C中的运行时上下文

    为了在线程和数据库连接之间建立松散的结合,Pro*C引入了一个概念runtime_context,我们称之为运行时上下文。一个运行时上下文包含了以下资源和信息:  LUPA开源社区rGo'BA5Bsv
1 与数据库服务器的连接;  LUPA开源社区)E}Y~j$Z?
2 当前连接上使用的游标;  LUPA开源社区^.re[1`v g
3 内嵌的一些选项,如MODE,HOLD_CURSOR,RELEASE_CURSOR和 SELECT_ERROR ;
T |{XyI0    不仅仅是简单的支持线程和连接之间的松散结合,Pro*C编译器还允许开发人员在线程和运行时上下文之间建立松散的结合,Pro*C允许在程序里为运行时上下文定义一个句柄,通过这个句柄,运行时上下文可以在线程之间切换。

运行时上下文的使用模式

1 多线程共享单个运行时上下文  LUPA开源社区5Y _6F3gBnd
2 多线程使用互相独立的运行时上下文  LUPA开源社区Uwm _|
    不管采用哪种模式,不能在同一时刻多个线程共享同一个运行时上下文。如果两个或两个以上的线程在同一时刻试图使用同一个运行时上下文,将会出现以下错误:SQL-02131: Runtime context in use。

多线程应用程序的用户接口

Pro*C编译器提供以下接口来支持多线程: 
5m6xey6v"m01 命令行选项,THREADS=YES|NO 
#U^8^y]02 内嵌SQL语句和指令  LUPA开源社区D'[IKE_g
3 线程安全的公共库函数

1.THREADS选项  LUPA开源社区T)LHlQ"l k1^5k
在proc预编译命令行上指定THREADS=YES,Pro*C编译器将保证产生的C代码是线程安全的。如果指定了THREADS=YES,Pro*C将会检查每个包含SQL执行语句的函数,是否指定了这些语句是在哪个运行时上下文中执行的,若没有发现这类指定标识,编译器就会返回错误。

2.内嵌SQL语句和指令 
&Q m$oilqWp0下列内嵌的SQL语句和指令用于支持多线程和运行时上下文的使用:  LUPA开源社区T&W%r ~q"|
EXEC SQL ENABLE THREADS; 
O;L ] qX Q I0EXEC SQL CONTEXT ALLOCATE :context_var;  LUPA开源社区p4mlPp2_ n.Q^%_
EXEC SQL CONTEXT USE {:context_var/DEFAULT};  LUPA开源社区A/Tbo\
EXEC SQL CONTEXT FREE :context_var; 
*qyJ g2`L#Bd0在以上SQL语句中,context_var是运行时上下文句柄,它必须被定义成sql_context类型:如sql_context context_var;  LUPA开源社区t'[ Zl$l
使用DEFAULT意味着接下来的SQL语句将使用默认的全局运行时上下文,直到另一条CONTEXT USE语句覆盖它。  LUPA开源社区yZ ?y8t
EXEC SQL ENABLE THREADS  LUPA开源社区,E Dd[hi U
这条可执行SQL语句初始化支持多线程的进程。它必须是程序中第一条可执行的SQL语句。 
}dCK!N I0EXEC SQL CONTEXT ALLOCATE  LUPA开源社区G#lWz0z&I&j
这条可执行SQL语句分配并初始化了一块用于指向一个新的运行时上下文的内存,并返回标识该上下文的句柄变量,该变量必须声明为sql_context类型。  LUPA开源社区Gal+kb6G8Z"e
EXEC SQL CONTEXT USE 
4q{-b7G,pw0y0这条指令性语句告诉编译器接下去执行的SQL语句将使用指定的运行时上下文,这里的运行时上下文必须在此前已经用CONTEXT ALLOCATE分配并初始化。 
vQh`,D E(r6G0EXEC SQL CONTEXT FREE 
T(yF ^7p(BLL0这条语句释放了运行时上下文句柄指定的内存,并把它设置空值。

3.编程时要考虑的问题 
~JL0i _)X w0尽管Oracle保证SQL库是线程安全的,但是你还是有责任保证你的Pro*C代码是为能在多线程下正确运行而设计的,例如,你必须考虑全局变量和静态变量的。 
b3EVJ |A"zw s0另外,多线程要求对以下问题进行考虑: 
jepB;l?!VI0把sqlca结构定义成线程安全的。典型的做法是在每个函数开始定义一个同名的局部变量。  LUPA开源社区*u ] }m;C(u,K)~
sqlda结构也和sqlca结构一样处理。 
T#m'i3X{6Z.D@j0把程序里的宿主变量定义成线程安全的。也就是说要小心处理程序里的全局变量和静态变量。  LUPA开源社区:]"HYK[ uE
避免同一时刻不同线程使用同一个运行时上下文。

     
p+v1@{*S#G6o8K0


TAG:

删除 znso4 发布于2007-12-21 13:24:36
楼主,我最近也做pro*c方面的工作,发现多线程会产生严重的内存泄露,你有碰到过吗。我发现CONTEXT ALLOCATE之后EXEC SQL CONTEXT FREE 并没有真正放内存释放了,只是置空指针了,我如果多次这样循环操作的话内存会狂涨
我来说两句

-5 -3 -1 - +1 +3 +5

Open Toolbar