<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

    蜜果私塾:如何進(jìn)行異構(gòu)數(shù)據(jù)庫(kù)同步(下篇)

    版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處:http://m.tkk7.com/amigoxie/archive/2011/07/24/354917.html

    文:阿蜜果

    日期:2011-7-24

    上篇:《如何進(jìn)行異構(gòu)數(shù)據(jù)庫(kù)同步(上篇)》

    1、詳細(xì)設(shè)計(jì)

    1.1 SQL語(yǔ)句通用解析程序

    首先需要一個(gè)通用的“SQL語(yǔ)句通用解析程序”,因?yàn)楫悩?gòu)數(shù)據(jù)庫(kù)的大部分表都與另外的表有一一對(duì)應(yīng)的關(guān)系,該解析程序用于對(duì)這些一一對(duì)應(yīng)的表進(jìn)行處理。

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

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

    <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>

    當(dāng)一方對(duì)freephone表操作的INSERT語(yǔ)句:

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

    根據(jù)上面XML配置和通用解析程序的處理,對(duì)應(yīng)對(duì)方的新的SQL語(yǔ)句為:

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

    再看一條UPDATE語(yǔ)句:

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

    轉(zhuǎn)換為對(duì)方的語(yǔ)句為:

    update PLAT_FreePhone set ProductID=4 where Phone=13122223333

    另外除了如上所演示的簡(jiǎn)單的類(lèi)型不同、字段名稱(chēng)不同,有些字段在對(duì)方?jīng)]有外,有時(shí)候有些字段還需要一定的轉(zhuǎn)換,例如在一方存儲(chǔ)的limited字符串是二進(jìn)制方式,例如111111,而對(duì)方存儲(chǔ)的是二進(jìn)制對(duì)應(yīng)的十進(jìn)制的值,再例如,一方存儲(chǔ)的是6位的時(shí)間(時(shí)分秒),而對(duì)方存儲(chǔ)的只是4位的時(shí)間(時(shí)分),那么可做一次自定義的substr操作。

    看另一個(gè)參考的XML實(shí)例:

    <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"表示需要進(jìn)行一次二進(jìn)制到十進(jìn)制的轉(zhuǎn)換,一方的如下語(yǔ)句:

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

    轉(zhuǎn)換成對(duì)方的INSERT語(yǔ)句如下:

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

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

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

    另外,還有一些字段本端沒(méi)有,對(duì)端具有并且有點(diǎn)還是必填字段,并且對(duì)端的這些字段需要填寫(xiě)固定的值,因此在INSERTUPDATEDELETE語(yǔ)句都需要進(jìn)行特別的操作,參考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語(yǔ)句接收器程序

          異構(gòu)數(shù)據(jù)庫(kù)的SQL語(yǔ)句傳過(guò)來(lái)時(shí),需要一個(gè)SQL語(yǔ)句接收器程序,該接收器解析該語(yǔ)句操作的表名(例如phonelimited)、執(zhí)行的操作名(INSERTUPDATE還是DELETE),根據(jù)這些信息讀取配置文件信息,決定是調(diào)用“1.1 SQL語(yǔ)句通用解析程序”進(jìn)行處理,如果不是存在一對(duì)一對(duì)應(yīng)關(guān)系的表,扔給配置的指定業(yè)務(wù)進(jìn)行特別處理。

          該程序的主要功能如下:

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

        2)分發(fā)SQL語(yǔ)句:將語(yǔ)句分發(fā)給不同程序進(jìn)行處理,解析接收到的SQL語(yǔ)句的表名和操作名稱(chēng),決定分發(fā)給通用解析進(jìn)行處理還是特定解析程序進(jìn)行處理。

             需要關(guān)注的問(wèn)題:當(dāng)多條SQL語(yǔ)句并發(fā)發(fā)送過(guò)來(lái)時(shí),是啟動(dòng)多個(gè)獨(dú)立的自動(dòng)機(jī)處理,還是將語(yǔ)句放入隊(duì)列中,依次出隊(duì)列進(jìn)行處理,還是采用其它方式進(jìn)行處理呢?每條SQL語(yǔ)句啟動(dòng)獨(dú)立的自動(dòng)機(jī)處理效率最高,但是也存在問(wèn)題:因?yàn)槎鄺l語(yǔ)句是競(jìng)爭(zhēng)操作,如果操作的是同樣的記錄但做相反操作時(shí)怎么辦?這些都是開(kāi)發(fā)人員需要考慮到的問(wèn)題。

    1.3 SQL單個(gè)表特定解析程序

             在上篇中提到,并不是所有的表在兩端有一一對(duì)應(yīng)的表,對(duì)于一些本端一個(gè)表對(duì)應(yīng)對(duì)端數(shù)據(jù)庫(kù)多個(gè)表,或者本端多個(gè)表對(duì)應(yīng)對(duì)端一個(gè)表的情況,通用解析程序不好處理這些語(yǔ)句,可將這些表采用特定的解析程序進(jìn)行處理。

             對(duì)于一個(gè)表對(duì)應(yīng)多個(gè)表的情況,可能一條INSERT語(yǔ)句對(duì)應(yīng)對(duì)端數(shù)據(jù)庫(kù)多條INSERTUPDATE語(yǔ)句。

             對(duì)于多個(gè)表對(duì)應(yīng)一個(gè)表的情況,一條INSERT語(yǔ)句可能對(duì)應(yīng)對(duì)方的一條INSERT語(yǔ)句或UPDATE語(yǔ)句。

    1.4 帶事務(wù)的操作

             像注冊(cè)等流程,要嚴(yán)格保證事務(wù),因此采用新舊系統(tǒng)提供接口(例如http接口或SOAP接口等)的方式,當(dāng)某一端調(diào)用注冊(cè)流程成功后,調(diào)用對(duì)端系統(tǒng)提供的注冊(cè)的接口完成操作。

             因?yàn)檫@種操作并不多,所以并不需要太多的工作量。

    1.5 數(shù)據(jù)校驗(yàn)程序

             要定期(一般是一天)對(duì)兩邊數(shù)據(jù)進(jìn)行校驗(yàn),對(duì)一些錯(cuò)誤的數(shù)據(jù)及時(shí)的更正,進(jìn)行數(shù)據(jù)校驗(yàn)首先要確定哪些東西需要進(jìn)行數(shù)據(jù)校驗(yàn),接著有針對(duì)性的進(jìn)行核對(duì)。

    2、擴(kuò)展閱讀

    2.1 數(shù)據(jù)同步方法

    對(duì)象變化是數(shù)據(jù)同步的基礎(chǔ),它直接決定了數(shù)據(jù)同步的更新方式和選時(shí)方式,所以數(shù)據(jù)同步常常按照變化捕獲的不同進(jìn)行分類(lèi),一般歸結(jié)于如下集中基本方法:

    1)基于快照法:快照是數(shù)據(jù)庫(kù)中存儲(chǔ)對(duì)象在某一時(shí)刻的即時(shí)映像。通過(guò)同步對(duì)象定義一個(gè)快照或采用類(lèi)似方法,可以將它的當(dāng)前映像作為更新副本的內(nèi)容。

    2)基于觸發(fā)器法:在源數(shù)據(jù)庫(kù)為同步對(duì)象創(chuàng)建相應(yīng)的觸發(fā)器,當(dāng)同步對(duì)象進(jìn)行INSERTUPDATEDELETEDML命令時(shí),觸發(fā)器被喚醒,將變化傳播到目標(biāo)數(shù)據(jù)庫(kù)。

    3)基于日志法:數(shù)據(jù)庫(kù)日志作為維護(hù)數(shù)據(jù)庫(kù)完整性的數(shù)據(jù)庫(kù)恢復(fù)的重要工具,其中已經(jīng)包含了全部成功提交的操作記錄信息。該方法通過(guò)分析數(shù)據(jù)庫(kù)日志的信息來(lái)捕獲同步對(duì)象的變化序列。

    4)基于API:一些小型的數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)沒(méi)有觸發(fā)器和日志機(jī)制,可以在應(yīng)用程序和數(shù)據(jù)庫(kù)之間引用一層中間件,由它提供一系列API,在API上來(lái)完成應(yīng)用程序?qū)?shù)據(jù)庫(kù)修改的同時(shí),記錄同步對(duì)象的變化序列。

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

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

     

    3、附錄

    1)《異構(gòu)數(shù)據(jù)庫(kù)同步問(wèn)題研究》:

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

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


    FeedBack:
    # re: 如何進(jìn)行異構(gòu)數(shù)據(jù)庫(kù)同步(下篇)
    2011-07-25 22:21 | AlleNny
    這樣一個(gè)個(gè)insert如果數(shù)據(jù)量很大的話(huà),效率非常低的。我曾經(jīng)這樣導(dǎo)出導(dǎo)入過(guò)很多上千萬(wàn)條數(shù)據(jù)的表,結(jié)果運(yùn)行一天一夜都沒(méi)完成。  回復(fù)  更多評(píng)論
      
    # re: 如何進(jìn)行異構(gòu)數(shù)據(jù)庫(kù)同步(下篇)
    2011-07-25 22:38 | 阿蜜果
    @AlleNny
    我是打算N個(gè)insert是N個(gè)自動(dòng)機(jī)去進(jìn)行的,一次可以啟動(dòng)N個(gè)自動(dòng)機(jī),不過(guò)擔(dān)心操作的數(shù)據(jù)有沖突。后來(lái)你的問(wèn)題是怎么解決的呢?  回復(fù)  更多評(píng)論
      
    <2011年7月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

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

          Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    相冊(cè)

    關(guān)注blog

    積分與排名

    • 積分 - 2294492
    • 排名 - 3

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 欧美最猛性xxxxx免费| 7723日本高清完整版免费| 欧洲人免费视频网站在线| 2022久久国产精品免费热麻豆| 一二三四免费观看在线电影| 免费国产一级特黄久久| 亚洲人成人一区二区三区| 亚洲欧洲精品久久| 激情小说亚洲色图| 国产中文字幕在线免费观看| 国产成人AV片无码免费| 好男人www免费高清视频在线| 四虎永久在线精品免费观看地址| 中文字幕日韩亚洲| 亚洲欧洲国产精品久久| 最新亚洲人成无码网www电影| 在线观看片免费人成视频播放| 91网站免费观看| 国产av无码专区亚洲国产精品| 亚洲综合婷婷久久| 日韩欧美亚洲中文乱码| 精品国产污污免费网站 | h视频免费高清在线观看| 91香蕉国产线在线观看免费| 永久免费bbbbbb视频| 久久精品国产亚洲麻豆| 亚洲自偷自偷在线成人网站传媒| 精品久久久久久国产免费了| 免费福利在线播放| 国产性爱在线观看亚洲黄色一级片| 亚洲精品国产情侣av在线| 青娱乐在线免费观看视频| 四虎在线视频免费观看视频| 久久亚洲2019中文字幕| 亚洲六月丁香六月婷婷色伊人| 亚洲国产免费综合| 成年女人免费视频播放77777| 亚洲av综合色区| 深夜特黄a级毛片免费播放| h视频在线观看免费网站| 国产成人亚洲综合无码|