听起来你需要一个事务性消息队列。
这是如何工作的很简单。更新主数据库时,可以向消息代理(无论更新的内容)发送一条消息,该消息可以转到任意数量的队列。每个从属数据库都可以有自己的队列,并且由于队列的保留顺序,进程最终应该正确同步(具有讽刺意味的是,这是大多数RDBMS在内部进行复制的方式)。
将消息队列视为一种 SCM 更改列表或修补程序列表数据库。也就是说,在大多数情况下,发送到master的相同(或大致相同)的SQL语句最终应复制到其他数据库。不必担心丢失消息,因为大多数消息队列都支持持久性和事务。
我建议你看看spring-amqp和/或spring-integration,特别是因为你用spring-batch标记了这个问题。
根据您的意见:
顺便说一句,你对性能问题的担忧不是很好,因为有太多的解决方法,但考虑到你不想做数据库特定的事情(如触发器和复制),我仍然觉得消息队列是你最好的选择。NOT IN
编辑 - 非 MQ 路由
由于我给了你一个艰难的时间询问这个问题,我将继续尝试帮助。除了消息队列之外,您还可以像我们之前尝试的那样执行某种XML文件。架构中所需的关键功能是 master 数据库上的“创建时间戳”列,以便在系统启动并运行时执行批处理(否则,您将不得不停止系统)。现在,如果您走这条路,您将希望小于当前时间。基本上,您只能在快照中获取行。SELECT * WHERE CREATE_TIME < ?
现在,在您的其他数据库上进行删除,您将要删除ID表上的行,但带有(即您可以使用JOINS而不是慢速)。幸运的是,您只需要删除所有列,而不需要其他列。其他列可以使用基于更新时间戳列的增量(用于更新,并创建插入)。inner joining
!=
NOT IN
ids