3 回答

TA贡献1831条经验 获得超9个赞
如果你不想改动数据的话。
你可以在数据库表上部署触发器,通过触发器将CUD操作的数据捕获并保存到到临时中间表,每条记录需要有操作属性,Insert Delete Update .
然后通过间隔调度任务读取中间表变化数据 封装为JMS消息,进行传输。
如果你连触发器和扫描增量表的的任务代码你都不愿意写。
那我推荐你使用kettle+ActiveMQ 组合方案。
kettle开源的ETL工具,负责增强变化数据提取,并通过内置的调度任务执行,封装数据为JMS消息。交给ActiveMQ 的队列通道进行路由传输

TA贡献1804条经验 获得超7个赞
建议的方式是使用专门的数据同步中间件,因为跨地域、机房的同步涉及到很多的问题:网络、安全、传输速度、数据冲突等。
我在做选型的时候看过这样几个:
1、tungsten-replicator:有点类似于MySQL的主从同步,双向同步可能是不支持的;
2、SymmetricDS:基于触发器&SQL方式监控变更;
3、阿里的Otter&Canal:基于BinLog或RedoLog的方式进行数据复制,功能比较强大,但是最好阅读下源代码再用。
对比了之后还是觉得Otter更好用一些,No.1和.2自己都需要做很多额外的工作,并且Otter的同步效率比较高(大概是MySQL主从同步效率的十几倍)。监控、管理、最小同步单位可以控制到列、对数据冲突处理也有相应的支持(但是这块没有测试过)、异构数据库也是可以的。 但是开源的版本貌似是不支持Oracle的。。。。。
总体上看有两种思路:
1、框架思路:即在框架上做文章,应用A使用框架X的时候,X同时负责发送一份数据给目标节点;
2、数据库同步思路:即框架是不限制的,只是控制数据库层面的复制工作
如果No.2有成形的产品,还是No.2简单一些,No.1需要处理的工作更复杂,且对应用有一定的侵入,但是好处是适应性比较好(比如可以同步数据库以外的数据,如缓存)

TA贡献1816条经验 获得超4个赞
如果是用hibernate的话,可以看看hibernate的事件监听,例如保存(提交前)事件!
这样只要在这个事件中调用MQ发送消息!
如果不是用hibernate的话,可以看看有没有类似的监听器可以使用!
- 3 回答
- 0 关注
- 181 浏览
添加回答
举报