oracle 使用SpringBoot监听数据库更改

6xfqseft  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(447)

实现以下解决方案的最简单方法是什么:
有一个旧的遗留应用程序使用Oracle DB,其想法是在SpringBoot中创建一个新的服务,该服务将观察此Oracle DB中一些特定表的更改,当它们发生时,服务将在新的Postgres DB中写入它们。
订阅和侦听Oracle DB中这些特定表的更改的最佳方法是什么?
我应该研究数据库特定的解决方案,还是有一个更通用的方法由SpringBoot提供,这是独立于数据库提供商?
我见过这个https://docs.oracle.com/cd/E18283_01/java.112/e16548/dbchgnf.htm
但我更希望有一种方法可以做到这一点,而不以任何方式触及遗留基础设施。
总结一下,我需要这个:
我们有数据库A和B,我们有一个SpringBoot应用程序,每当数据库A中的特定表发生更改时,我希望获得该更改的详细信息,并根据此更改将适当的数据持久化到数据库B。

5cnsuln7

5cnsuln71#

一个合适的解决方案需要编写大量的代码。
最好不要重新发明这个轮子。
你可以试试类似Debezium的东西:https://debezium.io
我不知道它是如何工作的;其体系结构如下所示:https://debezium.io/documentation/reference/stable/architecture.html,但我仍然不清楚它们是如何捕获更改的。顶部的图涉及Kafka,可能看起来有点矫枉过正,但在页面底部,他们声明您可以在java应用程序中嵌入debezium。
他们有一个用于Oracle的连接器:https://debezium.io/documentation/reference/stable/connectors/oracle.html

ergxz8rk

ergxz8rk2#

您正在遵循一种经常使用的方法,但这种方法有一些缺点。显然,唯一固定的部分是Sping Boot 的使用,但这种“应用程序”解决方案经常导致丢失,重复或错误的处理更改事件顺序(错误累积)。
更务实和保存的是“数据库”解决方案,它使用 * 事务 * 概念来避免上述问题,由三部分组成:

变更数据捕获

使用DIY触发器解决方案或提供的Oracle从旧方案中提取更改记录。请确保更改记录具有唯一标识和唯一顺序(没有可以重复的时间戳)

转账

简单的基于事务的更改记录从源数据库到目标数据库的传输。SELECT和INSERT是您的工具,不要使用 * 不支持事务 * 的消息传递系统。

变更申请

简单的MERGE作业通过应用更改来维护目标快照-同样基于事务。更改记录的 * 状态 *(打开、已应用、..)遵循相同的事务范围。

相关问题