借助两个开发包在PLSQL中实现多进程通信

借助两个开发包在PLSQL中实现多进程通信,第1张

借助两个开发包在PLSQL中实现多进程通信,第2张

PL/SQL是基于Oracle的主流应用编程语言。其主要特点是将SQL语句与过程化编程语言相结合,实现更复杂的业务逻辑。本文主要讨论多进程通信。

显然,多进程技术是用来提高应用的并发性,从而提高整个系统的执行效率。那么如何在PL/SQL中实现多进程通信呢?其实PL/SQL的初衷是增强SQL语句的功能,没有考虑其他编程语言的高级功能。所以PL/SQL中多进程通信的实现只能依靠Oracle提供的两个开发包:DBMS_PIPE和DBMS_ALERT。

1.数据库管理系统_管道

这个包提供了一种在多个进程之间进行管道通信的方法。例如,连接到同一个数据库的两个独立会话可以通过管道进行通信,它们也可以在存储过程和Pro*C之间进行通信,从而大大增强了PL/SQL的处理能力。该软件包主要提供两对功能:

pack _ message(v _ msg varchar 2)-将v _ msg信息打包到缓冲区中,准备发送;

send _ message(v_pipename varchar 2)-用于发送名为v _ pipename的管道的缓冲区;

unpack _ message(v _ msg varchar 2)-将信息解析成v _ msg

receive _ message(v_pipename varchar 2)-接受名为v _ pipename的管道的缓冲区;

执行的原理是:首先建立一个众所周知的管道(这点在你熟悉unix的时候就很清楚了),管道的发送方和接收方都有相应的接收和发送的缓冲区。需要注意的是,文本信息必须打包发送,通过解析可以读取信息。

为了理解前面的描述,这里是两个会话之间的通信的例子。

发送流程:

声明

v _ pipename varchar 2(30):= ' pipe 1 ';

v_status整数;

开始

dbms_pipe.pack_message('您好,这是发送进程!');

v _ status:= DBMS _ pipe . send _ message(v _ pipename);

如果v_status!那么=0

dbms_output.put_line('error!');

结束if;

结束;

/

验收流程:

声明

v _ pipename varchar 2(30):= ' pipe 1 ';

v_status整数;

v _ msg varchar 2(20);

开始

v _ status:= DBMS _ pipe . receive _ message(v _ pipename);

如果v_status!那么=0

DBMS _ output . put _ line(' error ');

结束if;

DBMS _ pipe . unpack _ message(v _ msg);

DBMS _ output . put _ line(v _ msg);

结束;

/

2.DBMS_ALERT

类似于DBMS_PIPE,DBMS_ALERT可以实现多个进程(会话)之间的通信。基本执行过程是:首先建立报警通道,然后通过报警通道发出报警信号;在接收端,需要注册报警通道,监控通道,然后等待报警信号的到来。以下是该软件包中主要功能的描述:

Dbms_alert.signal(报警管道名称,要发送的消息)-发送报警信息;

Dbms_alert.reGISter(报警管道名)-注册报警管道;

Dbms_alert.waitone(报警管道名称,接收消息值,返回状态值)——监控报警管道,等待消息的到来;

同样,这里有一个使用DBMS_ALERT的例子。

发送流程:

声明

v _ alert name varchar 2(30):= ' alert 1 ';

开始

dbms_alert.signal(v_alertName,'您好,这是发送进程!');

提交;

结束;

/

验收流程:

声明

v _ alert name varchar 2(30):= ' alert 1 ';

v_status整数;

v _ msg varchar 2(20);

开始

DBMS _ alert . register(v _ alert name);

dbms_alert.waitone(v_alertName,v_msg,v _ status);

如果v_status!那么=0

DBMS _ output . put _ line(' error ');

结束if;

DBMS _ output . put _ line(v _ msg);

结束;

/

解释

DBMS_PIPE和DBMS_ALERT这两个包都可以在进程间进行通信,但它们之间存在一些差异:

(1)报警信号是同步的。在会话发出Commit之前,不会发出警报;如果它所在的事务回滚,则不会发送信号。但是管道信号是异步的,它的通信过程不受事务提交和回滚的影响。

(2)沿管道传递的消息只能由一个进程处理,通过复制和删除来接收消息,但报警信号可以由多个进程获得,即只通过复制来接收消息。

(3)管道消息不仅可以传输文本信息,还可以传输其他信息,如对象等。,这得益于其对消息封装的预处理;而且报警信息只能是文本,不能是其他类型。

4.摘要

近年来,虽然多进程应用逐渐被多线程应用所取代,但多进程应用仍然有其适用的空。希望读者通过本文的简要介绍,对基于PL/SQL的多进程通信技术有一个初步的了解,为进一步的开发打下一定的基础。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 借助两个开发包在PLSQL中实现多进程通信

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情