为了账号安全,请及时绑定邮箱和手机立即绑定

请问有没有其他的比较好的方式?如果有,是什么?

请问有没有其他的比较好的方式?如果有,是什么?

肥皂起泡泡 2022-09-17 15:11:30

存在2个数据库服务器,A和B(Oracle)

存在2个应用服务器C和D

欧洲部署:C+A

深圳部署:D+B

也就是:

欧洲的同学访问欧洲的服务器C,C连接A数据库

深圳的同学访问深圳的服务器D,D连接B数据库

欧洲的同学改动的是表T1,T2

深圳的同学可以改动所有的数据,包括T1,T2

然后问题来了,这2边的人的访问需要获取一致的数据,如何实现?

目前已经实现了一种方式,通过在应用的业务逻辑代码中硬编码数据同步的逻辑,通过JMS,消息代理服务器为ActiveMQ,但是这样做的缺点现在已经体现的非常明显,就是需要针对于每一个实施了增删改的方法进行硬编码,开发工作量非常大


查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1523条经验 获得超9个赞

如果你不想改动数据的话。

你可以在数据库表上部署触发器,通过触发器将CUD操作的数据捕获并保存到到临时中间表,每条记录需要有操作属性,Insert  Delete  Update .

然后通过间隔调度任务读取中间表变化数据 封装为JMS消息,进行传输。

如果你连触发器和扫描增量表的的任务代码你都不愿意写。

那我推荐你使用kettle+ActiveMQ 组合方案。

kettle开源的ETL工具,负责增强变化数据提取,并通过内置的调度任务执行,封装数据为JMS消息。交给ActiveMQ 的队列通道进行路由传输

查看完整回答
反对 回复 2022-09-21
?
三国纷争

TA贡献1502条经验 获得超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需要处理的工作更复杂,且对应用有一定的侵入,但是好处是适应性比较好(比如可以同步数据库以外的数据,如缓存)

查看完整回答
反对 回复 2022-09-21
?
繁华开满天机

TA贡献1486条经验 获得超4个赞

如果是用hibernate的话,可以看看hibernate的事件监听,例如保存(提交前)事件!
这样只要在这个事件中调用MQ发送消息!
如果不是用hibernate的话,可以看看有没有类似的监听器可以使用!

查看完整回答
反对 回复 2022-09-21

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信