PL/SQL 中的事件驱动编程

Posted

技术标签:

【中文标题】PL/SQL 中的事件驱动编程【英文标题】:Event-driven programming in PL/SQL 【发布时间】:2011-02-16 19:22:22 【问题描述】:

我有两个 PL/SQL 系统,驻留在两个独立的数据库中。 SystemA 将需要填充 SystemB 的表。这可能会通过数据链路完成。每次在 SystemB 的表中插入一组记录时,必须运行 SystemB 中的一个进程。我可以等待 SystemA 完成,然后运行脚本以开始在 SystemB 中处理,但由于 SystemA 可能会花费数小时处理然后填充 SystemB,我宁愿 SystemB 在每组记录可用时立即处理它们(每个set 可以独立于其他人进行处理,因此应该可以正常工作)。

我不确定如何在 PL/SQL 中进行偶数驱动编程。我需要 SystemA 通知 SystemB 一组已准备好进行处理。我的第一个想法是在 SystemB 中有一个特殊的“事件”表,然后当 SystemA 完成一组时,它插入到“事件”表中,并且插入时有一个触发器启动该过程(并且该过程可能很长,每个进程可能需要 5-10 分钟)在 SystemB 中。我对 Oracle 中的触发器没有足够的经验来知道这是否是一种既定的方法,或者是否有更好的机制。建议?尖端?建议?

【问题讨论】:

【参考方案1】:

使用 Oracle 高级队列;它是为此而设计的。我相信您仍然需要在两个系统之间建立数据库链接(在这种情况下是从 B 到 A,以使用 A 上的队列)。

【讨论】:

会有一个从 A 到 B 的 dblink,因此 A 可以插入 B 的表中。队列必须在 A 中,而 B 需要到 B 的链接? 最常见的情况是,A 上的进程将插入 A 上的队列,B 上的进程将从 B 上的进程出列消息的队列,并且您会使用 AQ 来告诉A 上的队列将消息传递到 B 上的队列。这样,您的代码永远不必处理网络连接暂时中断的问题——AQ 将处理向远程计算机的传递。 不,队列存在于 A 上。B 读取 A 上的队列以执行所需的任何操作。例如,如果 A 通过数据库链接使用触发器将数据“推送”到 B,则 A 的处理能力受到 B 的可用性和它们之间网络的可靠性的限制。我的操作是假设 OP 想要处理 B 上的每条记录或每批记录一次且仅一次;如果是这种情况,A 上的持久性单消费者队列将允许 B 读取每条消息并成为它的唯一接收者。 @Justin Cave:感谢您的提示。这相对容易实现吗?从我所做的小研究来看,大部分设置工作似乎都是为 DBA 完成的,PL/SQL 代码本身看起来几乎简单...... @Adam Musch:正确,每个批次只应处理一次(但如果我们尝试调试问题,我们可能希望重复批次)。【参考方案2】:

是的,Oracle 高级队列甚至让 A 向 B 提交一个古老的 Oracle 作业会是一个更好的主意。

而且,如果您的流程需要将数据从 A 完全复制到 B,那么您可能希望看起来像 Oracle Streams 流程来复制数据然后进行处理。

【讨论】:

这不是复制,它更像是从 A 转移到 B 的蒸馏。我还将研究 Oracle Jobs。谢谢!

以上是关于PL/SQL 中的事件驱动编程的主要内容,如果未能解决你的问题,请参考以下文章

反应式编程与事件驱动编程有何不同?

事件驱动编程

事件驱动

flutter入门之dart中的并发编程异步和事件驱动详解

flutter入门之dart中的并发编程异步和事件驱动详解

Python并发编程-事件驱动模型