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