日期:2014-05-17  浏览次数:20669 次

oralcle大虾进
现在用户方有个ORACLE数据库DB1,我们有个ORACLE数据库DB2,DB1只提供给我们查询权限。用户方会在某些业务操作后,更新DB1中某些表的数据(可能增加记录,也可能删除记录,也可能只是更新某一记录的个别字段),这时会调用我们提供的webservice服务通知我们,我们则需要同步DB1中这些表的数据到DB2中(表名都一样,但是表结构可能不同)。
   
  现在我们的做法是根据这些表的主键进行DB2和DB1的对比:如果DB1和DB2都存在该记录,则不操作;如果DB1存在,DB2不存在,则插入一条新纪录,;如果DB1不存在而DB2存在,则需要删除。

  数据量目前大概几千条吧,但随着时间以后很难说了,请大家帮忙出个效率上能够好点的方案。因为每次都要进行两个表中所有记录的对比,有可能出现1000条记录,但是只有几条记录做了更新。

------解决方案--------------------
如果数据库DB1中,将来数据量比较大,但是每次修改的量却很少,即需要和DB2同步的数据比较少,则不宜采用逐条比较的方式。
1.看你能不能在DB1中的表增加一个字段modi,默认为0,来标识当前记录是否被修改过的,或者是否已经同步,如果刚修改过但没有同步,则为1,同步了后为0;经过这样,你在某个时段或事件下,将表中modi值为1的记录与DB2同步。

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

不知道有没有更好的方法,大家讨论,鄙人陋见,望能抛砖引玉!

------解决方案--------------------
1、在DB2加上DB1的数据库链接
2、DB2加一个同步数据的存储过程
3、存储过程写法
先做删除,规则:如果DB1不存在而DB2存在,则需要删除
再做插入,规则:如果DB1存在,DB2不存在,则插入一条新纪录
4、在获得webservice通知后,调用存储过程同步数据

结束

如果数据量在1000条记录,只有几条记录做了更新的话,估计此过程执行时间会小于1秒
前提是DB1与DB2之间连接速度很快。同一机房,光纤连接
------解决方案--------------------
Full out join on t1.pid = t2.pid做对比,将对比结果存入临时表
删除临时表中 ,t1与t2匹配上的记录
不匹配的结果,该新增的新增,该删除的删除。