概念:
高级队列(Advanced Queue,简称AQ):
高级队列是oracle的一种高级应用,它主要是表和触发器之间的组合而成的一种应用。其主要作用是在各应用系统中进行消息传递。
目的:
利用高级队列来实现消息在两个不同数据库之间的异步传输,满足业务系统的改造需求。
基本环境:
DB1:Oracle 10g Version 10.2.0.4.0
DB2:Oracle 10g Version 10.2.0.4.0
基本组成:
发送方(DB1):
Queue type:决定发送消息的类型
Queue table:消息发送的载体
Queue:队列
Subscriber:订购者,同一个队列可以有n个订购者
Propagation:传播进程
接收方(DB2):
Queue type:决定接收消息的类型
Queue table:消息接收的载体
Queue:队列
发送方(DB1)代码:
1.创建aq用户并赋权
--sys用户操作,其他操作为aq用户
create user aq identified by aq;
grant connect,resource,aq_administrator_role,unlimited tablespace to aq;
grant create database link to aq;
grant execute on dbms_aq to aq;
grant execute on dbms_aqadm to aq;

begin
dbms_aqadm.grant_system_privilege('ENQUEUE_ANY', 'aq', FALSE);
dbms_aqadm.grant_system_privilege('DEQUEUE_ANY', 'aq', FALSE);
end;
2.创建db link
create database link db2.LK connect to AQ using db2;
确认dblink有效。
3.创建type
CREATE type aq.Message_typ as object (
subject      VARCHAR2(30),
text         VARCHAR2(80));
可根据自己的需求决定具体字段。
4.创建queue
DECLARE
   subscriber sys.aq$_agent;
BEGIN
   --根据type创建queue table
   DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table         => 'aq.que_shenshou_tab',
                                 multiple_consumers => TRUE,
                                 queue_payload_type => 'aq.Message_typ');
   --根据queue table创建queue
   DBMS_AQADM.CREATE_QUEUE(queue_name   => 'aq.que_shenshou',
                           queue_table => 'aq.que_shenshou_tab');
   --开始这个queue
   DBMS_AQADM.START_QUEUE(queue_name => 'aq.que_shenshou');
   --添加一个subscriber
   --这里可以添加n个subscriber,每个subscriber相当于一个独立的通道
   --这里shenshou1为consumer name,接收端要根据这个名字来决定出队
   --aq.que_shenshou@db2.Lk为接收端(db2)上的queue名和dblink的组合
   subscriber := sys.aq$_agent('shenshou1', 'aq.que_shenshou@db2.lk', NULL);
   DBMS_AQADM.ADD_SUBSCRIBER(queue_name => 'que_shenshou',
                             subscriber => subscriber);
   --创建propagation
   DBMS_AQADM.SCHEDULE_PROPAGATION(queue_name   => 'que_shenshou',
                                   destination => 'db2.lk');
END;
至此,发送端队列创建完毕。
可通过以下视图查看:
select * from user_queue_tables;
select * from user_queues;
select * from user_queue_subscribers;
select * from user_queue_schedules;

posted on 2011-01-26 18:38  Brad Miller  阅读(14065)  评论(0编辑  收藏  举报