(转)dbms常用包之dbms_alert包小结

oracle内部提供的在数据库内部和应用程序间通信的方式有一下几种:1.警报,就是DBMS_ALERT包提供的功能;2.管道,由 DBMS_PIPE提供;3.高级队列,这个就很复杂,当然提供的功能也是很高级的。当然还可以使用外部过程,比如用PL/SQL封装外部的基于C的 DLL或JAVA也能实现数据库和应用程序间的通信。
要使用这些功能,必须知道各个功能的特点,根据需要选用。
警报和事务相关的,是异步发送的;管道是与事务无关的,是同步发送的。
警报的使用:
简单来说,警报是在服务器端发出,然后在客户端接收,这就需要在客户端有一个线程来监听警报。现在拿SQLPLUS做个例子,打开两个SQLPLUS,分 别用提示符SQL1和SQL2表示。首先应先授予用户使用DBMS_ALERT的权限。登录到SYS用户下,执行一下语句:
GRANT EXECUTE ON DBMS_ALERT TO SCOTT;
--在一个SQLPLUS中(客户端)...
SQL1> set serveroutput on
SQL1> declare
l_status integer;
l_name varchar2(30);
l_msg varchar2(100);
begin
dbms_alert.register('a');--注册,对警报名称为'a'的警报感兴趣
dbms_alert.waitany(l_name,l_msg,l_status);
if l_status = 0 then
dbms_output.put_line('name:'||l_name);
dbms_output.put_line('msg:'||l_msg);
end if;
dbms_alert.removeall;
end;
/


--这时SQL1的会话将处于等待状态。在另一个SQLPLUS中(这是服务器端)
SQL2> exec dbms_alert.signal('a','bbb');

PL/SQL 过程已成功完成。

SQL2> commit;--必须提交事务,否则接收不到警报
--则在第一个SQLPLUS中显示如下:
name:A
msg:bbb
(如果不显示请设置 set serveroutput on )
PL/SQL 过程已成功完成。
SQL1>
基本的过程就是这样,具体的说明见Oracle Document。可以这么查看有关DBMS_ALERT包的信息:
set pagesize 0
set linesize 100
select text from all_source where name='DBMS_ALERT' AND TYPE='PACKAGE';在使用警报的过程中应注意以下几点:
1.客户端的接收线程应采用轮询的方式来监听警报,否则,当主线程退出时,将因为无法正常结束该监听子线程从而非正常退出引发资源泄漏的问题;
2.警报的名称和信息都是字符串,都是可以自定义的,只要发方和收方约定即可;
3.在事务非常频繁,在断时间内产生大量警报的时候,警报可能出现会因处理不及时而消失的现象,即如果服务器端连着发出了两个警报(即在很短的时间内提交 了两次,警报名称相同,警报内容不同),而客户端来不及处理(比如客户端轮询警报肯定有时间间隔),那么客户端只能接收到后面一个警报,从而产生警报丢失 的现象;可以参看SYS.DBMS_ALERT_INFO表,就知道为什么。这张表是用来存放所有要由客户端取走的警报的信息,其主键是 (SID,NAME),即会话ID和警报名称,这样,当一客户端不能处理(接收)当前警报的时候,如果再来一个相同名称的警报,那么只有用后一条警报的信 息修改前一条警报的信息啦。
4.一般用一个线程来专门接收警报,稍作处理后(如对警报名称和内容作简单解析),就将解析后的内容传给主线程进行处理,不要在监听线程中执行费时较长的操作。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/70612/viewspace-1019809/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/70612/viewspace-1019809/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值