猿问

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

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

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

欧洲部署:C+A

深圳部署:D+B

也就是:

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

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

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

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

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

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


肥皂起泡泡
浏览 182回答 3
3回答

天涯尽头无女友

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

三国纷争

建议的方式是使用专门的数据同步中间件,因为跨地域、机房的同步涉及到很多的问题:网络、安全、传输速度、数据冲突等。我在做选型的时候看过这样几个: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需要处理的工作更复杂,且对应用有一定的侵入,但是好处是适应性比较好(比如可以同步数据库以外的数据,如缓存)

繁华开满天机

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

相关分类

Oracle
我要回答