Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跨数据库同步表数据_Java_Sql_Spring Batch_Spring Amqp_Spring Integration - Fatal编程技术网

Java 跨数据库同步表数据

Java 跨数据库同步表数据,java,sql,spring-batch,spring-amqp,spring-integration,Java,Sql,Spring Batch,Spring Amqp,Spring Integration,我有一个表在一个字段上记录它的行插入/更新时间戳 我想将此表中的数据与另一个db服务器上的另一个表同步。两台db服务器未连接,同步为单向(主/从)。使用表触发器不合适 我的工作流程: 我使用全局last_sync_date参数和查询表Master 更改/插入的记录 将结果行输出为xml 使用更新和插入解析xml和更新表从属 在处理主表的已删除记录时,问题的复杂性增加。为了捕获已删除的记录,我想我必须为先前插入的记录维护一个日志表,并使用sql“notin”。在处理大型数据集时,这会成为一个性

我有一个表在一个字段上记录它的行插入/更新时间戳

我想将此表中的数据与另一个db服务器上的另一个表同步。两台db服务器未连接,同步为单向(主/从)。使用表触发器不合适

我的工作流程:

  • 我使用全局last_sync_date参数和查询表Master 更改/插入的记录
  • 将结果行输出为xml
  • 使用更新和插入解析xml和更新表从属
在处理主表的已删除记录时,问题的复杂性增加。为了捕获已删除的记录,我想我必须为先前插入的记录维护一个日志表,并使用sql“notin”。在处理大型数据集时,这会成为一个性能问题


处理这种情况的替代工作流是什么?

我不确定解决方案。但我希望这些链接可以帮助你


非常有趣的问题

在五月的情况下,我有足够的RAM来加载主表和从表中的所有ID以区分它们

如果主表中的ID是连续的,您可以尝试在主表中维护一组完整的填充范围(使用了所有ID的范围,没有空格,如100101102103)


要在不将所有id加载到内存的情况下查找已删除的id,您可以执行SQL查询来计算
id>=full\u region.start和id的记录数,为什么不添加一个指示上次更新/插入/删除时间的时间戳列?然后添加一个已删除的列——即,将该行标记为已删除,而不是立即实际删除。导出删除操作后将其删除

如果您无法更改现有应用程序中的架构用法:


你不能使用触发器吗?第二个(“隐藏”)表如何,它填充了每个插入/更新/删除,并将构成下一个要生成的xml导出文件的内容?这是一个常见的概念:历史记录(或“日志”)表:它有自己的progressing id列,可以用作导出标记。

我同意另一条评论,这需要使用触发器。我认为另一个表应该包含sql语句的历史记录。请参阅关于使用2008扩展事件。。。然后,您可以获取整个sql,并将结果查询存储在历史记录表中。如果要将其存储为mysql查询或mssql查询,则由您决定。

请查看:

Oracle GoldenGate是一个全面的软件包,用于支持 异构数据环境中的数据复制。产品 set支持高可用性解决方案、实时数据集成、, 事务性更改数据捕获、数据复制、转换、, 在运营企业和分析企业之间进行验证 系统

:

SymmetricDS是多主数据库的开源软件 跨网络的复制、筛选同步或转换 异构环境中的网络。它支持多个 具有单向或双向异步数据的订阅服务器 复制

:

水仙花复制器是一个用于数据同步的Java工具 各种数据库服务器之间的迁移和数据备份


为需要同步的表创建一个历史记录表(基本上是该表的副本,可能还有一些额外的字段),并在活动表中每次插入/更新/删除某些内容时插入整行

编写一个Spring批处理作业,根据历史记录表的额外字段将数据同步到从机


希望这有帮助。

允许在当前工作流中删除的潜在选项:

在触发器限制仅限于跨数据库引用的触发器的情况下,当前工作流中的一个可能解决方案是在主数据库中创建一个helper表,以仅存储已删除行的唯一标识符(或任何使您能够最有效地删除已删除行的唯一键)

这些ID需要在删除时由主表上的触发器插入

使用与插入/更新相同的机制,在插入和更新之后创建一个任务。您可以将助手表导出为xml,如您在当前工作流中所述


此任务只需从从属表中删除行,然后在任务完成后从助手表中删除所有数据。记录任务中的任何错误,以便您能够解决此问题,因为没有审核跟踪。

以下是我的看法。您真的需要处理此问题吗?我假设从属表用于报告目的。因此,我想问的问题是,它应该是如何更新的?如果数据已经存在一天,是否可以?您是否计划每晚刷新


如果是这样的话,忘记这个在线同步过程,下载完整的表;将其发送到mysql并批量加载。处理时间可能比您想象的要快得多。

听起来您需要一个事务性消息队列。

其工作原理很简单。当您更新主数据库时,您可以向消息代理(无论更新是什么)发送消息,该消息代理可以发送到任意数量的队列。每个从数据库都可以有自己的队列,并且由于队列的保留顺序,进程最终应该正确同步(具有讽刺意味的是,这就是大多数RDBMS在内部进行复制的方式)

将消息队列视为一种SCM更改列表或修补程序列表数据库。也就是说,发送给master的大部分相同(或大致相同)SQL语句最终都应该复制到其他数据库。不要担心丢失消息,因为大多数消息队列都支持持久性和事务

我建议您查看和/或,尤其是因为您将此问题标记为

基于你的