现在用户方有个ORACLE数据库DB1,我们有个ORACLE数据库DB2,DB1只提供给我们查询权限。用户方会在某些业务操作后,更新DB1中某些表的数据(可能增加记录,也可能删除记录,也可能只是更新某一记录的个别字段),这时会调用我们提供的webservice服务通知我们,我们则需要同步DB1中这些表的数据到DB2中(表名都一样,但是表结构可能不同)。
    
   现在我们的做法是根据这些表的主键进行DB2和DB1的对比:如果DB1和DB2都存在该记录,则不操作;如果DB1存在,DB2不存在,则插入一条新纪录,;如果DB1不存在而DB2存在,则需要删除。   数据量目前大概几千条吧,但随着时间以后很难说了,请大家帮忙出个效率上能够好点的方案。因为每次都要进行两个表中所有记录的对比,有可能出现1000条记录,但是只有几条记录做了更新。

解决方案 »

  1.   

        如果数据库DB1中,将来数据量比较大,但是每次修改的量却很少,即需要和DB2同步的数据比较少,则不宜采用逐条比较的方式。
        1.看你能不能在DB1中的表增加一个字段modi,默认为0,来标识当前记录是否被修改过的,或者是否已经同步,如果刚修改过但没有同步,则为1,同步了后为0;经过这样,你在某个时段或事件下,将表中modi值为1的记录与DB2同步。
         
        2.如果DB1不让动,可以在业务操作时,将DB1中表记录的变动情况保存在另外的数据库DB3(DB3和DB1在同一服务器),这样,你在某个时段或事件下,将DB3的记录与DB2同步。    不知道有没有更好的方法,大家讨论,鄙人陋见,望能抛砖引玉!
      

  2.   

    1、在DB2加上DB1的数据库链接
    2、DB2加一个同步数据的存储过程
    3、存储过程写法
    先做删除,规则:如果DB1不存在而DB2存在,则需要删除
    再做插入,规则:如果DB1存在,DB2不存在,则插入一条新纪录
    4、在获得webservice通知后,调用存储过程同步数据结束如果数据量在1000条记录,只有几条记录做了更新的话,估计此过程执行时间会小于1秒
    前提是DB1与DB2之间连接速度很快。同一机房,光纤连接
      

  3.   

    Full out join on t1.pid = t2.pid做对比,将对比结果存入临时表
    删除临时表中 ,t1与t2匹配上的记录
    不匹配的结果,该新增的新增,该删除的删除。
      

  4.   

    试试goldengate或者odi。
    odi对复杂转换支持的比较好。
    goldengate对异构数据库支持比较好。goldengate基于日志挖掘,号称亚秒级同步,现在应用的案例很多。
      

  5.   

    goldengate你那天提了后我立刻下载了一个试试看,是挺好用的啊,不过只是简单测试了一下,大数据量下的效率没有测试。
      

  6.   

    调用webservice服务的时候不能加个参数吗?把修改的id号传给你
      

  7.   

    用merge into 不行么?如果数据量多了,我估计用户方自己也不会用WEBSERVICE了,性能不咋地,网络是仅次于IO的瓶颈哦。
      

  8.   

    在需要同步的表上做个触发器,按主键把你增加、删除、修改的记录记录到一张表上,另外一台机器做个JAVA程序,实时去扫描那张表,再去同步数据,以前做过一个项目就是用这种方法同步的!
      

  9.   

    用户方更新的数据有个期限吧?  可以删除一定天数的数据,然后重新再导入那么多天的数据,这样就可以保证DB1与DB2数据的同步。  以前我也做过类似的数据同步,我们只对7天内的数据进行同步(也就是说,用户改今天起7天内的数据,我们这边可以提到),7天以后的,就不再同步。
      

  10.   

    感谢各位关注,痛苦的地方就在于数据库不能增加任何字段标识,并且WEBSERVICE只传一个String字段表示用户所做的业务类型,然后我们再根据该业务类型去做相应的表数据的同步。
      

  11.   

    DB1和DB2中间有DBLINK吗?如果没有的话,只用WEB SERVICE对付大数据量确实有问题。可以从设计上着手,减少冗余字段的传输。不用每次都要全量比较吧?