如何单向同步oracle数据库与外部系统(Oracle AQ)?



我想通过OData服务将数据从预言机同步/发送到另一个系统,即预言机中的数据需要主要 在另一个系统中复制(可能另一个系统中复制的数据的 ID 也需要存储在预言机中)。因此,通信将始终由预言机系统启动。
为了应对可能的网络中断等,实现简单的发送可能不是帖子的想法。我需要一种机制来对消息进行排队,直到成功处理它们。 实现这一点的方法是什么?
我的主管建议使用某种同步表,因为他们在我的公司做过类似的事情。我试图阅读如何同步,可能的方法是使用消息传递队列或更准确地说是 Oracle 高级队列。也许有人可以给出一些建议,是否可以实现和使用Oracle AQ进行如下操作(我对其他选项持开放态度):
插入/更新需要复制的表的记录。触发器触发,将消息(稍后通过 ODAta 发送)写入消息队列。另一个进程被安排为非常x分钟处理消息队列,尝试将数据发送到另一个系统,如果成功的消息从队列中删除,如果以后不重复,则在网络错误的情况下或在出现其他错误的情况下留在手动处理的队列中。 任何想法建议,想法或示例,不胜感激。

AQ 是一个简单的(免费)解决方案。 这是一个基本的演示

--
-- Setup
--
SQL> create or replace type demo_t as object ( x number , y number );
2  /
Type created.
SQL> begin
2      dbms_aqadm.create_queue_table (
3             queue_table=>'DEMO_QT',
4             queue_payload_type=>'DEMO_T'
5             --,sort_list=>'PRIORITY,ENQ_TIME'
6             );
7
8      dbms_aqadm.create_queue (
9             queue_name => 'DEMO_Q',
10             queue_table => 'DEMO_QT');
11
12      dbms_aqadm.start_queue (
13         queue_name => 'DEMO_Q');
14  end;
15  /
PL/SQL procedure successfully completed.

排队代码(触发器中会有的那种东西

SQL>
SQL> declare
2    l_enqueue_options    dbms_aq.enqueue_options_t;
3    l_message_properties dbms_aq.message_properties_t;
4    l_msgid              raw(16);
5  BEGIN
6      dbms_aq.enqueue(
7          queue_name => 'DEMO_Q',
8          enqueue_options => l_enqueue_options,
9          message_properties => l_message_properties,
10          payload =>demo_t(10,20),
11          msgid => l_msgid);
12  end;
13  /
PL/SQL procedure successfully completed.

取消排队代码 - 代理/守护程序将运行什么以将消息分派到另一个目标。

SQL>
SQL> set serverout on
SQL> declare
2     l_dequeue_options    dbms_aq.dequeue_options_t;
3     l_message_properties dbms_aq.message_properties_t;
4     l_msgid              RAW(16);
5     l_message            demo_t;
6  begin
7     loop
8       dbms_aq.dequeue(queue_name         => 'DEMO_Q',
9                       dequeue_options    => l_dequeue_options,
10                       message_properties => l_message_properties,
11                       payload            => l_message,
12                       msgid              => l_msgid);
13
14       dbms_output.put_line( l_message.x);
15       commit;
16       --
17       -- normally this would be an endless loop,
18       -- but we'll exit here just for demo purposes
19       --
20       exit;
21     end loop;
22  end;
23  /
10
PL/SQL procedure successfully completed.

最新更新