Ser*_*uşu 14 java sql spring-batch
我有一个表记录其在字段上的行插入/更新时间戳.
我想将此表中的数据与另一个数据库服务器上的另一个表同步.两个数据库服务器未连接,同步是单向(主/从).使用表触发器不合适
我的工作流程
处理Master表的已删除记录时,问题的复杂性会增加.为了捕获已删除的记录,我认为我必须为先前插入的记录维护一个日志表并使用sql"NOT IN".在处理大型数据集时,这会成为性能问题.
什么是处理这种情况的替代工作流程?
听起来你需要一个事务性消息队列.
这是如何工作的很简单.更新主数据库时,您可以向消息代理(无论更新是什么)发送消息,该代理可以转到任意数量的队列.每个从属数据库都可以拥有自己的队列,并且由于队列保持顺序,进程最终应该正确同步(具有讽刺意味的是,这是大多数RDBMS在内部进行复制的方式).
将Message Queue视为一种SCM更改列表或补丁列表数据库.在大多数情况下,发送给master的相同(或大致相同)的SQL语句最终应该复制到其他数据库.不要担心丢失消息,因为大多数消息队列都支持持久性和事务.
我建议你看一下spring-amqp和/或spring-integration,特别是因为你用spring-batch标记了这个问题.
根据您的意见:
顺便说一句,你担心NOT IN
性能问题不是很好,因为有太多的解决办法,但鉴于你不想做DB特定的事情(比如触发器和复制),我仍觉得消息队列是你最好的选择.
编辑 - 非MQ路线
因为我给你一个关于问这个问题的艰难时期,我将继续努力提供帮助.除了消息队列,你可以像我们之前尝试的那样做一些XML文件.模式中需要的关键功能是主数据库上的CREATE TIMESTAMP列,以便您可以在系统启动和运行时执行批处理(否则您将不得不停止系统).现在,如果你走这条路线,你会希望SELECT * WHERE CREATE_TIME < ?
小于当前时间.基本上你只能在快照中获取行.
现在在你的另一个数据库中删除你要删除inner joining
ID表上的行但是!=
(你可以使用JOINS而不是慢速NOT IN
).幸运的是,你只需要所有的ids
删除而不是其他列.其他列可以使用基于更新时间戳列的增量(用于更新,并创建aka插入).
归档时间: |
|
查看次数: |
11267 次 |
最近记录: |