oralcle大虾进

heyanlan2007heyanlan 2011-03-04 12:34:02
现在用户方有个ORACLE数据库DB1,我们有个ORACLE数据库DB2,DB1只提供给我们查询权限。用户方会在某些业务操作后,更新DB1中某些表的数据(可能增加记录,也可能删除记录,也可能只是更新某一记录的个别字段),这时会调用我们提供的webservice服务通知我们,我们则需要同步DB1中这些表的数据到DB2中(表名都一样,但是表结构可能不同)。

现在我们的做法是根据这些表的主键进行DB2和DB1的对比:如果DB1和DB2都存在该记录,则不操作;如果DB1存在,DB2不存在,则插入一条新纪录,;如果DB1不存在而DB2存在,则需要删除。

数据量目前大概几千条吧,但随着时间以后很难说了,请大家帮忙出个效率上能够好点的方案。因为每次都要进行两个表中所有记录的对比,有可能出现1000条记录,但是只有几条记录做了更新。
...全文
132 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakaxi 2011-03-10
  • 打赏
  • 举报
回复
DB1和DB2中间有DBLINK吗?如果没有的话,只用WEB SERVICE对付大数据量确实有问题。可以从设计上着手,减少冗余字段的传输。不用每次都要全量比较吧?
  • 打赏
  • 举报
回复
感谢各位关注,痛苦的地方就在于数据库不能增加任何字段标识,并且WEBSERVICE只传一个String字段表示用户所做的业务类型,然后我们再根据该业务类型去做相应的表数据的同步。
wangzhanjieandweb 2011-03-08
  • 打赏
  • 举报
回复
用户方更新的数据有个期限吧? 可以删除一定天数的数据,然后重新再导入那么多天的数据,这样就可以保证DB1与DB2数据的同步。 以前我也做过类似的数据同步,我们只对7天内的数据进行同步(也就是说,用户改今天起7天内的数据,我们这边可以提到),7天以后的,就不再同步。
changhe325 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wffffc 的回复:]

引用楼主 heyanlan2007heyanlan 的回复:
。。。更新DB1中某些表的数据(可能增加记录,也可能删除记录,也可能只是更新某一记录的个别字段),这时会调用我们提供的webservice服务通知我们,。。。。

现在我们的做法是……

调用webservice服务的时候不能加个参数吗?把修改的id号传给你
[/Quote]
youshang444 2011-03-06
  • 打赏
  • 举报
回复
在需要同步的表上做个触发器,按主键把你增加、删除、修改的记录记录到一张表上,另外一台机器做个JAVA程序,实时去扫描那张表,再去同步数据,以前做过一个项目就是用这种方法同步的!
wffffc 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 heyanlan2007heyanlan 的回复:]
。。。更新DB1中某些表的数据(可能增加记录,也可能删除记录,也可能只是更新某一记录的个别字段),这时会调用我们提供的webservice服务通知我们,。。。。

现在我们的做法是……
[/Quote]
调用webservice服务的时候不能加个参数吗?把修改的id号传给你
biristone 2011-03-05
  • 打赏
  • 举报
回复
用merge into 不行么?如果数据量多了,我估计用户方自己也不会用WEBSERVICE了,性能不咋地,网络是仅次于IO的瓶颈哦。
ilovemk 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 minitoy 的回复:]

试试goldengate或者odi。
odi对复杂转换支持的比较好。
goldengate对异构数据库支持比较好。goldengate基于日志挖掘,号称亚秒级同步,现在应用的案例很多。
[/Quote]
goldengate你那天提了后我立刻下载了一个试试看,是挺好用的啊,不过只是简单测试了一下,大数据量下的效率没有测试。
minitoy 2011-03-04
  • 打赏
  • 举报
回复
试试goldengate或者odi。
odi对复杂转换支持的比较好。
goldengate对异构数据库支持比较好。goldengate基于日志挖掘,号称亚秒级同步,现在应用的案例很多。
notebook800 2011-03-04
  • 打赏
  • 举报
回复
Full out join on t1.pid = t2.pid做对比,将对比结果存入临时表
删除临时表中 ,t1与t2匹配上的记录
不匹配的结果,该新增的新增,该删除的删除。
notebook800 2011-03-04
  • 打赏
  • 举报
回复
1、在DB2加上DB1的数据库链接
2、DB2加一个同步数据的存储过程
3、存储过程写法
先做删除,规则:如果DB1不存在而DB2存在,则需要删除
再做插入,规则:如果DB1存在,DB2不存在,则插入一条新纪录
4、在获得webservice通知后,调用存储过程同步数据

结束

如果数据量在1000条记录,只有几条记录做了更新的话,估计此过程执行时间会小于1秒
前提是DB1与DB2之间连接速度很快。同一机房,光纤连接
huaqi2820 2011-03-04
  • 打赏
  • 举报
回复
如果数据库DB1中,将来数据量比较大,但是每次修改的量却很少,即需要和DB2同步的数据比较少,则不宜采用逐条比较的方式。
1.看你能不能在DB1中的表增加一个字段modi,默认为0,来标识当前记录是否被修改过的,或者是否已经同步,如果刚修改过但没有同步,则为1,同步了后为0;经过这样,你在某个时段或事件下,将表中modi值为1的记录与DB2同步。

2.如果DB1不让动,可以在业务操作时,将DB1中表记录的变动情况保存在另外的数据库DB3(DB3和DB1在同一服务器),这样,你在某个时段或事件下,将DB3的记录与DB2同步。

不知道有没有更好的方法,大家讨论,鄙人陋见,望能抛砖引玉!
yukiMark 2011-03-04
  • 打赏
  • 举报
回复
不好意思, 我是小虾啊。。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧