网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  借助两个开发包在pl/sql中实现多进程通信     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:47次  录入:管理员--2008-06-20  
 

【赛迪网-it技术报道】pl/sql是基于oracle的一个主流应用程序编程语言,它的主要特点是将sql语句与过程化程序开发语言相结合,以实现更为复杂的商业逻辑。本文主要就其中多进程通信进行讨论。

显然,多进程技术是用来提高应用的并发性,进而提高整个系统的执行效率,那么如何在pl/sql中实现多进程的通信呢?其实,pl/sql其设计的初衷主要是增强sql语句的功能,而没有考虑到其他编程语言的高级功能,所以在pl/sql中实现多进程通信只能借助于oracle提供的两个开发包:dbms_pipe和dbms_alert。

1.dbms_pipe

该包提供多进程之间管道通信的方法,比如连接到同一个数据库的两个独立会话之间可以通过管道进行通信,另外也可以在存储过程和pro*c之间进行通信,这样就大大地增强了pl/sql的处理能力。该包主要提供两对函数:

pack_message(v_msg varchar2)-----将v_msg信息打包放入到缓冲器中,准备发送;

send_message(v_pipename varchar2)-----发送名为v_pipename的管道的缓冲器;

unpack_message(v_msg varchar2)-----将信息解析到v_msg中;

receive_message(v_pipename varchar2)----接受名为v_pipename的管道的缓冲器;

其执行的原理是:首先建立有名管道(这点熟悉unix很清楚),管道的发送端和接受端都有相应的缓冲器进行接受和发送处理,要注意的是,文本信息必须打包来发送,通过解析来读取信息。

为了理解前面的描述,下面列举一个两个会话之间通信的实例。

发送进程:

declare

v_pipename varchar2(30):='pipe1';

v_status integer;

begin

dbms_pipe.pack_message(' hello,this is sending process!');

v_status:=dbms_pipe.send_message(v_pipename);

if v_status !=0 then

dbms_output.put_line('error!');

end if;

end;

/

接受进程:

declare

v_pipename varchar2(30):='pipe1';

v_status integer;

v_msg varchar2(20);

begin

v_status:=dbms_pipe.receive_message(v_pipename);

if v_status !=0 then

dbms_output.put_line('error');

end if;

dbms_pipe.unpack_message(v_msg);

dbms_output.put_line(v_msg);

end;

/

2.dbms_alert

与dbms_pipe类似,dbms_alert可以实现多个进程(会话)之间的通信。其基本的执行过程为:首先建立一个报警通道,然后通过报警通道来发送报警信号;在接收端需要先注册该报警通道,对该通道进行监听,然后等待报警信号的到来。下面是该包中的主要函数说明:

dbms_alert.signal(报警管道名,待发送消息)---发送报警信息;

dbms_alert.register(报警管道名)------注册报警管道;

dbms_alert.waitone(报警管道名,接受消息值,返回状态值)-------对报警管道进行监听,等待消息的到来;

同样,这里也给出使用dbms_alert的一个实例。

发送进程:

declare

v_alertname varchar2(30):='alert1';

begin

dbms_alert.signal(v_alertname,' hello,this is sending process!');

commit;

end;

/

接受进程:

declare

v_alertname varchar2(30):='alert1';

v_status integer;

v_msg varchar2(20);

begin

dbms_alert.register(v_alertname);

dbms_alert.waitone(v_alertname,v_msg,v_status);

if v_status !=0 then

dbms_output.put_line('error');

end if;

dbms_output.put_line(v_msg);

end;

/

3.说明

dbms_pipe和dbms_alert这两个包都可以进行多进程间的通信,但两者任然是有一些区别:

(1) 报警信号是同步的。报警信号直到会话发出commit时才被发出;如果它所处的事务回滚,则该信号就不发送了。但是管道信号是异步的,而且其通信过程不受事务提交和回滚的影响。

(2) 沿着管道进行传递的消息只能被一个进程进行处理,其消息的接收方式是拷贝后删除,但是报警信号可以被多个进程所获得,即消息的接收方式仅仅是拷贝。

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

4.总结

近年来,虽然多进程应用有逐渐被多线程应用取代的趋势,但是多进程仍然有其适用的空间,希望读者通过本文初浅的介绍,对基于pl/sql的多进程通信这一技术有一个初步的认识,这样为以后深入的开发打下一定的基础。

 
 
上一篇: oracle的三种备份方式具有不同的恢复特性    下一篇: 用pipelined table实现split函数的示例
  相关文档
如何将oralce数据库中孤独临时段清除 04-16
深入讲解ora-00600 2262错误的解决方法 04-03
指定一个where条件来有条件地导出记录 04-03
要求例程恢复,无法设置archivelog模式 03-03
教你在windows环境下kill掉oracle的线程 06-04
教你快速掌握oracle中"kill"进程的方法 (1) 01-31
教你利用Rownum来限制查询所返回的行数 06-17
学会使用Oracle中的时间间隔型数据 04-11
oracle数据库与用户角色权限相关的视图 05-07
细化解析:oracle数据库的空间使用和管理 11-15
用Oracle动态性能视图采集查询调优数 04-23
为什么oracle有时会用索引来查找数据? 11-15
Oracle系统密码文件创建、使用及维护 04-11
Oracle数据库安全性管理基本措施简介 04-11
巧用外部表访问警告日志文件或跟踪文件 05-15
Oracle数据库中如何改善表空间的管理 04-11
如何处理oracle中temp表空间满的问题 03-03
自定义临时表实现及在Oracle Spatial应用 05-27
如何使用new_value将查询结果传递给变量 04-10
从多个方面详细讲解sqlplus的使用技巧 (1) 03-04
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息