<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0

    蜜果私塾:如何進行異構數據庫同步(下篇)

    版權所有,轉載請注明出處:http://m.tkk7.com/amigoxie/archive/2011/07/24/354917.html

    文:阿蜜果

    日期:2011-7-24

    上篇:《如何進行異構數據庫同步(上篇)》

    1、詳細設計

    1.1 SQL語句通用解析程序

    首先需要一個通用的“SQL語句通用解析程序”,因為異構數據庫的大部分表都與另外的表有一一對應的關系,該解析程序用于對這些一一對應的表進行處理。

    表與表之間的對應關系基于上篇提到的整理的Excel文檔,“SQL語句通用解析程序”如何讀取對應關系對收到的INSERTUPDATEDELETE語句進行處理呢?筆者采用的是將對應關系寫入XML文檔中,當然也可以采用另外的方式。

    參考XML格式如下(Oracle 新系統 ->  SQL Server舊系統):

    <table name="freephone" partyName="PLAT_FreePhone" fieldCount="8">
         
    <field name="Phone" partyName="Phone" primary="true" />
         
    <field name="ProductID" type="varchar" partyName="ProductID" partyType="int" />
         
    <field name="AreaId" partyName="" />
         
    <field name="Effect" partyName="" />
         
    <field name="EffectLess" partyName="" />
         
    <field name="Addtime" type="varchar" partyName="AddTime" partyType="datetime" partyValue/>
         
    <field name="Operator" partyName="Operator" />
         
    <field name="Remark" partyName="Remark" />
     
    </table>

    當一方對freephone表操作的INSERT語句:

    insert into freephone (Phone, ProductID, AreaId, Effect, EffectLess, Addtime, Operator, Remark)values(‘13122223333’,‘003’,25,‘20110724000000’,‘20111024235959’,‘20110702409000000’, ‘amigo’, ‘amigo add!’)

    根據上面XML配置和通用解析程序的處理,對應對方的新的SQL語句為:

    INSERT INTO PLAT_FreePhone(Phone, ProductID, AddTime, Operator, Remark) values(‘13122223333’, 3GETDATE(), ‘amigo’, ‘amigo add!’)

    再看一條UPDATE語句:

    update freephone set ProductID=004’, AreaId=26 where Phone=13122223333

    轉換為對方的語句為:

    update PLAT_FreePhone set ProductID=4 where Phone=13122223333

    另外除了如上所演示的簡單的類型不同、字段名稱不同,有些字段在對方沒有外,有時候有些字段還需要一定的轉換,例如在一方存儲的limited字符串是二進制方式,例如111111,而對方存儲的是二進制對應的十進制的值,再例如,一方存儲的是6位的時間(時分秒),而對方存儲的只是4位的時間(時分),那么可做一次自定義的substr操作。

    看另一個參考的XML實例:

    <table name="phonelimited" partyName="PLAT_PhoneLimited" fieldCount="6">
        
    <field name="Phonenumber" partyName="Phone" primary="true" />
        
    <field name="AreaId" type="int" partyName="AreaID" partyType="int" />
        
    <field name="Limited" type="varchar" partyName="Limited" partyType="int" function="binToDec" />
        
    <field name="AddTime" type="varchar" partyName="AddTime" partyType="datetime" />
        
    <field name="Operator" partyName="Operator" />
        
    <field name="Remark" partyName="Remark" />
    </table>

    其中:function="binToDec"表示需要進行一次二進制到十進制的轉換,一方的如下語句:

    insert into phonelimited(Phonenumber, AreaId, Limited) values(‘13122223333’, 25, ‘10110’)

    轉換成對方的INSERT語句如下:

    insert into PLAT_PhoneLimited(Phone, AreaID, Limited) values(‘13122223333’, 2522)

    需要做取字串操作的參考定義如下:

    <field name="StartTime" length="6" partyName="OpenTime" partyLength="4" function="substr" />

    另外,還有一些字段本端沒有,對端具有并且有點還是必填字段,并且對端的這些字段需要填寫固定的值,因此在INSERTUPDATEDELETE語句都需要進行特別的操作,參考XML定義如下:

    ……
    <insert fieldCount="2">
        
    <field name="Node" value="0" />
        
    <field name="Key" value="" />
    </insert>
    <update condition="and Node=0 and key=''" />
    <delete condition="and Node=0 and key=''" />
    ……

    1.2 SQL語句接收器程序

          異構數據庫的SQL語句傳過來時,需要一個SQL語句接收器程序,該接收器解析該語句操作的表名(例如phonelimited)、執行的操作名(INSERTUPDATE還是DELETE),根據這些信息讀取配置文件信息,決定是調用“1.1 SQL語句通用解析程序”進行處理,如果不是存在一對一對應關系的表,扔給配置的指定業務進行特別處理。

          該程序的主要功能如下:

    1)接收SQL語句:只接收需要同步的表的INSERTUPDATEDELETE語句,SELECT語句直接丟棄;

        2)分發SQL語句:將語句分發給不同程序進行處理,解析接收到的SQL語句的表名和操作名稱,決定分發給通用解析進行處理還是特定解析程序進行處理。

             需要關注的問題:當多條SQL語句并發發送過來時,是啟動多個獨立的自動機處理,還是將語句放入隊列中,依次出隊列進行處理,還是采用其它方式進行處理呢?每條SQL語句啟動獨立的自動機處理效率最高,但是也存在問題:因為多條語句是競爭操作,如果操作的是同樣的記錄但做相反操作時怎么辦?這些都是開發人員需要考慮到的問題。

    1.3 SQL單個表特定解析程序

             在上篇中提到,并不是所有的表在兩端有一一對應的表,對于一些本端一個表對應對端數據庫多個表,或者本端多個表對應對端一個表的情況,通用解析程序不好處理這些語句,可將這些表采用特定的解析程序進行處理。

             對于一個表對應多個表的情況,可能一條INSERT語句對應對端數據庫多條INSERTUPDATE語句。

             對于多個表對應一個表的情況,一條INSERT語句可能對應對方的一條INSERT語句或UPDATE語句。

    1.4 帶事務的操作

             像注冊等流程,要嚴格保證事務,因此采用新舊系統提供接口(例如http接口或SOAP接口等)的方式,當某一端調用注冊流程成功后,調用對端系統提供的注冊的接口完成操作。

             因為這種操作并不多,所以并不需要太多的工作量。

    1.5 數據校驗程序

             要定期(一般是一天)對兩邊數據進行校驗,對一些錯誤的數據及時的更正,進行數據校驗首先要確定哪些東西需要進行數據校驗,接著有針對性的進行核對。

    2、擴展閱讀

    2.1 數據同步方法

    對象變化是數據同步的基礎,它直接決定了數據同步的更新方式和選時方式,所以數據同步常常按照變化捕獲的不同進行分類,一般歸結于如下集中基本方法:

    1)基于快照法:快照是數據庫中存儲對象在某一時刻的即時映像。通過同步對象定義一個快照或采用類似方法,可以將它的當前映像作為更新副本的內容。

    2)基于觸發器法:在源數據庫為同步對象創建相應的觸發器,當同步對象進行INSERTUPDATEDELETEDML命令時,觸發器被喚醒,將變化傳播到目標數據庫。

    3)基于日志法:數據庫日志作為維護數據庫完整性的數據庫恢復的重要工具,其中已經包含了全部成功提交的操作記錄信息。該方法通過分析數據庫日志的信息來捕獲同步對象的變化序列。

    4)基于API:一些小型的數據庫和非關系型數據庫沒有觸發器和日志機制,可以在應用程序和數據庫之間引用一層中間件,由它提供一系列API,在API上來完成應用程序對數據庫修改的同時,記錄同步對象的變化序列。

    5)基于影子表法:許多情況下,源程序無須了解同步對象的每一個操作,只要知道最后總共發生了什么變化就夠了。因此,可以在初始化時為同步對象表T建立一個影子表S,作為一份當時的拷貝,以后通過在適當時機通過比較當前TS的內容獲取凈變化信息。

    6)基于控制表變化法:就是為每個要同步的表創建一個控制表CC包含了主鍵字段Pk和一些控制信息字段,當T中某個字段發生改變時,C中同主鍵Pk的記錄也隨即被修改。這一過程通常可以通過觸發器實現,到時候只需根據C就知道T中的變化信息。

     

    3、附錄

    1)《異構數據庫同步問題研究》:

    http://wenku.baidu.com/view/d3b283bff121dd36a32d8293.html

    posted on 2011-07-24 13:05 阿蜜果 閱讀(2348) 評論(2)  編輯  收藏 所屬分類: 解決方案


    FeedBack:
    # re: 如何進行異構數據庫同步(下篇)
    2011-07-25 22:21 | AlleNny
    這樣一個個insert如果數據量很大的話,效率非常低的。我曾經這樣導出導入過很多上千萬條數據的表,結果運行一天一夜都沒完成。  回復  更多評論
      
    # re: 如何進行異構數據庫同步(下篇)
    2011-07-25 22:38 | 阿蜜果
    @AlleNny
    我是打算N個insert是N個自動機去進行的,一次可以啟動N個自動機,不過擔心操作的數據有沖突。后來你的問題是怎么解決的呢?  回復  更多評論
      
    <2011年7月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉Axure RP  (2015年12月出版)
          

          Power Designer系統分析與建模實戰  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2294516
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产另类久久久精品| 亚洲国产成人精品激情| 57pao国产成永久免费视频| 中国亚洲呦女专区| 91麻豆精品国产自产在线观看亚洲| 一级毛片免费观看不卡视频| 亚洲日本VA午夜在线电影| 亚洲日韩aⅴ在线视频| 午夜宅男在线永久免费观看网 | 一级毛片免费观看不收费| 亚洲an天堂an在线观看| 四虎永久成人免费| 久久不见久久见免费视频7| 真人无码作爱免费视频| 亚洲激情视频网站| 日本亚洲国产一区二区三区| 国产成人午夜精品免费视频| 国产在线精品一区免费香蕉| 久久国产亚洲精品| 午夜亚洲www湿好大| 免费在线观看的黄色网址| 91视频免费网址| 成人网站免费大全日韩国产| 亚洲一区二区三区丝袜| 亚洲综合在线观看视频| 亚洲精品A在线观看| 成人av免费电影| 99精品视频在线观看免费播放 | 午夜成人免费视频| 在线免费观看你懂的| 国产JIZZ中国JIZZ免费看| 亚洲av无码专区在线电影| 亚洲国产美女精品久久久久| 日本亚洲视频在线| 久久久久亚洲爆乳少妇无| 国产精品深夜福利免费观看| 无码国产精品一区二区免费式直播| 久久香蕉国产线看免费| 有色视频在线观看免费高清在线直播| 国产成人亚洲合集青青草原精品| 亚洲今日精彩视频|