如何将oracle db与外部系统(Oracle AQ)同步?

时间:2018-04-10 19:11:26

标签: oracle synchronization

我想通过OData服务将数据从oracle同步/发送到另一个系统,即oracle中的数据需要主要是 在另一个系统中复制(可能其他系统中复制数据的ID也需要存储在oracle中)。因此,通信将始终由oracle系统启动 为了应对可能的网络故障等,实现简单发送可能不是后期想法。我需要一种机制,将消息排队,直到它们被成功处理。 实现这个的方法是什么?
我的主管建议使用某种同步表,因为他们在我公司做过类似的事情。我试着阅读如何同步,可能的方法是使用消息队列或更精确的Oracle高级队列。也许有人可以提供一些建议是否可以实现并且合理地使用Oracle AQ来实现类似下面的内容(我对其他选项持开放态度):
插入/更新需要复制的表的记录。触发器触发,将消息(稍后通过ODAta发送)写入消息队列。另一个进程被安排处理消息队列非常x分钟,尝试将数据发送到另一个系统,如果成功消息从队列中删除,如果在网络错误的情况下不再重复或在队列中手动处理其他错误。 任何想法的建议,想法或例子都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

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.