基于Web Service的數(shù)據(jù)庫(kù)同步系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)和技術(shù)專業(yè)_第1頁(yè)
基于Web Service的數(shù)據(jù)庫(kù)同步系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)和技術(shù)專業(yè)_第2頁(yè)
基于Web Service的數(shù)據(jù)庫(kù)同步系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)和技術(shù)專業(yè)_第3頁(yè)
基于Web Service的數(shù)據(jù)庫(kù)同步系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)和技術(shù)專業(yè)_第4頁(yè)
基于Web Service的數(shù)據(jù)庫(kù)同步系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)和技術(shù)專業(yè)_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第24頁(yè)共24頁(yè)基于WebService的數(shù)據(jù)庫(kù)同步系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)摘要結(jié)合當(dāng)前流行的WebService和ADO.NET技術(shù)構(gòu)造了一個(gè)不受平臺(tái)限制的異構(gòu)數(shù)據(jù)庫(kù)同步系統(tǒng)。實(shí)現(xiàn)了處于Internet上的SqlServer2000向Oracle的單向同步功能,能夠基于IP的安全身份驗(yàn)證功能,多個(gè)IP實(shí)現(xiàn)了凈量數(shù)據(jù)的傳輸。對(duì)同步的配置信息采用XML存儲(chǔ),采用Windows應(yīng)用程序界面化配置,操作方便、易懂。因?yàn)橥江h(huán)境是對(duì)處于Internet上的異構(gòu)數(shù)據(jù)庫(kù)的實(shí)時(shí)同步;在設(shè)計(jì)與開(kāi)發(fā)中,重點(diǎn)關(guān)注異構(gòu)數(shù)據(jù)庫(kù)的同步以及數(shù)據(jù)傳輸?shù)目煽啃?;探討能?shí)現(xiàn)可靠數(shù)據(jù)的同步,以及傳輸?shù)母咝?。介紹了實(shí)現(xiàn)系統(tǒng)的思路以及所需的關(guān)鍵技術(shù)。系統(tǒng)用到的相關(guān)技術(shù)有捕獲技術(shù)Windows托盤服務(wù)、多線程處理、以及網(wǎng)絡(luò)消息機(jī)制、多IP同步、同步IP權(quán)限驗(yàn)證、同步表名及字段以及字段類型的可配置、異構(gòu)數(shù)據(jù)類型的轉(zhuǎn)換、WebService等。關(guān)鍵詞:WebService;異構(gòu)數(shù)據(jù)庫(kù);同步;ADO.NET;TheDesignandImplementationofDatabaseSynchronizationSystemBasedonWebServiceAbstractWecanconstructtheHeterogeneousdatabasesynchronoussystemusingWebService.Ithasrealizedthefunctionofone-waysynchronousfromSQLServer2000toOracle.Ithassomefunctions,thesecurityauthenticationofIP,thedatatransmissionofIP,theSynchronizationconfigurationusingXMLstorageandthewindowsapplicationprogramUIwhichcanmakethissystembeoperatedeasily.Becausethesynchronousenvironmentwillbereal-timesynchronousforheterogeneousdatabaseontheInternet,inthedesignandimplementation,thissystemhasshowedthesynchronizationofheterogeneousdatabaseanddatatransmissionreliability,achievingthesynchronizationofreliabledata,thesecuritymethodsofdatatransmission,andtheefficiencytransmission.Itwilldisplaytheideasofrealizationandthenecessarycriticaltechnologies.Therearesomerelevanttechnologiesthatthissystemused,forexample,thecapturetechnology,thewindowstrayservice,multi-threadprocessing,andthenetworknewsmechanism,andsoon.Keywords:WebService;HeterogeneousDatabase;Synchronization;ADO.NET;目錄論文總頁(yè)數(shù):24頁(yè)1 引言 11.1 課題背景 11.2 國(guó)內(nèi)外研究現(xiàn)狀 11.3 本課題研究的意義 21.4 本課題的研究方法 22 WebService數(shù)據(jù)庫(kù)同步原理 32.1 WebService構(gòu)成與特點(diǎn) 32.1.1 WebServcie的結(jié)構(gòu) 32.1.2 WebServcie的關(guān)鍵技術(shù)協(xié)議 32.1.3 WebServcie的特點(diǎn) 42.1.4 WebServcie安全 52.2 數(shù)據(jù)庫(kù)復(fù)制的分類 52.3 復(fù)制數(shù)據(jù)的類型 62.4 數(shù)據(jù)捕獲技術(shù) 72.5 沖突檢測(cè) 83 需求分析 93.1 同步環(huán)境 93.2 功能需求 93.3 性能需求 103.4 輸入輸出要求 103.5 運(yùn)行需求 104 方案設(shè)計(jì) 114.1 數(shù)據(jù)庫(kù)同步復(fù)制模型 114.2 數(shù)據(jù)庫(kù)設(shè)計(jì) 114.2.1 源結(jié)點(diǎn)SqlServer2000表設(shè)計(jì) 114.2.2 目的結(jié)點(diǎn)Oracle表設(shè)計(jì) 124.3 模塊設(shè)計(jì) 134.3.1 數(shù)據(jù)捕獲部分 134.3.2 同步部分 134.3.3 沖突檢測(cè)處理部分 165 代碼實(shí)現(xiàn) 165.1 開(kāi)發(fā)環(huán)境 165.2 關(guān)鍵代碼詳解。 165.2.1 數(shù)據(jù)捕獲部分 165.2.2 同步部分 176 測(cè)試 196.1 功能測(cè)試 196.2 性能測(cè)試 20結(jié)論 21參考文獻(xiàn) 21致謝 23聲明 24引言課題背景隨著信息化建設(shè)的深入,企業(yè)和政府如何將己有的“信息孤島”連通起來(lái),實(shí)現(xiàn)信息的集成與共享是當(dāng)前需要解決的一個(gè)關(guān)鍵問(wèn)題。特別是企業(yè)和政府部門多數(shù)采用層次管理摸式,各個(gè)部門、分支機(jī)構(gòu)可能處于Internet上的不同區(qū)域,上下級(jí)機(jī)構(gòu)之間需要進(jìn)行大量的數(shù)據(jù)匯總與分發(fā),實(shí)現(xiàn)整個(gè)企業(yè)或政府部門的數(shù)據(jù)集成。這種數(shù)據(jù)集成是從一個(gè)或多個(gè)數(shù)據(jù)庫(kù)中抽取數(shù)據(jù),經(jīng)過(guò)遠(yuǎn)程傳輸處理后再加載到另一個(gè)數(shù)據(jù)庫(kù)中。各分支機(jī)構(gòu)數(shù)據(jù)庫(kù)系統(tǒng)又包括異構(gòu)的與同構(gòu)的,這里的異構(gòu)可以是操作系統(tǒng)的異構(gòu),可以是數(shù)據(jù)庫(kù)管理系統(tǒng)的異構(gòu),也可以是數(shù)據(jù)庫(kù)內(nèi)部表結(jié)構(gòu)的異構(gòu)。然而,分布式數(shù)據(jù)庫(kù)系統(tǒng)既要提供局部自治又要實(shí)現(xiàn)全局控制,給數(shù)據(jù)的同步帶來(lái)了很大的挑戰(zhàn)性。如何在不同組織之間、不同類型、不同平臺(tái)的數(shù)據(jù)庫(kù)系統(tǒng)之間進(jìn)行數(shù)據(jù)同步工作,是數(shù)據(jù)庫(kù)領(lǐng)域一個(gè)研究方向。特別是對(duì)于異構(gòu)的情況。WebService的出現(xiàn)使異構(gòu)數(shù)據(jù)庫(kù)同步的情況變得較為容易實(shí)現(xiàn),因?yàn)樗且环N完全的無(wú)語(yǔ)言相關(guān)性、無(wú)平臺(tái)相關(guān)性、無(wú)對(duì)象相關(guān)性的模型。非常適合于Internet上的數(shù)據(jù)集成。國(guó)內(nèi)外研究現(xiàn)狀國(guó)外對(duì)數(shù)據(jù)集成的研究比較早,許多數(shù)據(jù)庫(kù)系統(tǒng)提供了專門的數(shù)據(jù)轉(zhuǎn)換集成工具。如SQLServer2000的DTS,Oracle的SQL*Loader,IBM的VisualWarehouse等。另外,還有一些第三方軟件開(kāi)發(fā)商也推出一些產(chǎn)品,例如:AscentialSoftware公司的DataStage,AppliedDatabaseTechnology公司的DataMapper,Dataflux公司的SmartScurb和DataJunction公司開(kāi)發(fā)的析取包等。這些數(shù)據(jù)庫(kù)附帶的、第三方公司開(kāi)發(fā)的數(shù)據(jù)集成工具對(duì)于結(jié)構(gòu)化數(shù)據(jù)在功能上可以說(shuō)已經(jīng)基本上能滿足一般的要求。而對(duì)于數(shù)據(jù)庫(kù)研究組織來(lái)說(shuō),不少研究小組針對(duì)數(shù)據(jù)集成中一些重要的技術(shù)難點(diǎn)展開(kāi)研究工作,例如集成模型,數(shù)據(jù)集成的通用性,數(shù)據(jù)集成的構(gòu)件化,數(shù)據(jù)轉(zhuǎn)換的技術(shù),數(shù)據(jù)轉(zhuǎn)換規(guī)則的制訂,數(shù)據(jù)同步策略等等。 異構(gòu)數(shù)據(jù)同步方法的研究現(xiàn)狀: 集成數(shù)據(jù)的質(zhì)量是整個(gè)系統(tǒng)的關(guān)鍵點(diǎn),而保證源數(shù)據(jù)和目標(biāo)數(shù)據(jù)庫(kù)的數(shù)據(jù)同步則是保證數(shù)據(jù)質(zhì)量的前提,特別是在目前分布式異步數(shù)據(jù)集成的環(huán)境下,減少數(shù)據(jù)傳輸過(guò)程中的冗余量,實(shí)現(xiàn)數(shù)據(jù)同步的高效性和增量報(bào)送成為數(shù)據(jù)同步的目標(biāo)。J.Hammer教授討論了數(shù)據(jù)同步的兩種可能方法;如果數(shù)據(jù)源是功能完備的數(shù)據(jù)庫(kù)系統(tǒng),則可以通過(guò)定義一組觸發(fā)器,或者通過(guò)讀取日志的方式來(lái)檢測(cè)分析數(shù)據(jù)源的變化實(shí)現(xiàn)數(shù)據(jù)同步。該方法的可行性及實(shí)現(xiàn)依賴于具體的數(shù)據(jù)源類型,比如文本型數(shù)據(jù)源就不支持日志或觸發(fā)器機(jī)制。而對(duì)于任意類型的數(shù)據(jù)源,都可以采用基于快照差分的方法實(shí)現(xiàn)數(shù)據(jù)同步:每隔一定時(shí)期重新生成基表的快照,同上一次的舊快照作差分計(jì)算,得到反映基表自上次到本次生成快照以來(lái)變化的增量數(shù)據(jù)。增量數(shù)據(jù)中可以只包含數(shù)據(jù)源中被刪除或插入的元組W.J.Labio綜述了可應(yīng)用于快照差分的算法,包括幾種常用算法:SortMerge算法、PartitionHash算法、Window算法,和一類新提出的基于壓縮策略的算法,并對(duì)所有這些算法作了詳盡的分析。在增量數(shù)據(jù)更新方面,目前有五種技術(shù)可以達(dá)到數(shù)據(jù)增量更新的要求。第一種方法是掃描已經(jīng)打上時(shí)間戳的數(shù)據(jù),當(dāng)一個(gè)應(yīng)用對(duì)記錄的最后一次修改打上時(shí)間戳?xí)r,掃描程序就根據(jù)時(shí)間戳得到增量數(shù)據(jù),但必須原業(yè)務(wù)系統(tǒng)存在時(shí)間戳字段:第二種方法是掃描增量文件,增量文件僅記錄應(yīng)用中所發(fā)生的變化,有了增量文件,掃描的過(guò)程就會(huì)高效,增量文件的生成可以改造應(yīng)用來(lái)完成,如觸發(fā)器:第三種方法就是掃描日志文件或?qū)徲?jì)文件,但必須使用某種技術(shù)手段作為日志文件內(nèi)容輸出的接口,常見(jiàn)的使用Sybase的工具RepliactionServer來(lái)識(shí)別:第四種方法就是修改以往的應(yīng)用程序代碼,使這些程序能夠數(shù)據(jù)集成;第五種方法就是將前后兩個(gè)快照文件進(jìn)行比對(duì)。目前,國(guó)內(nèi)大部分應(yīng)用系統(tǒng)采用針對(duì)系統(tǒng)本身設(shè)計(jì)開(kāi)發(fā)的數(shù)據(jù)集成工具,有的甚至用手工方法實(shí)現(xiàn)數(shù)據(jù)抽取、轉(zhuǎn)換和加載。因此當(dāng)目標(biāo)數(shù)據(jù)庫(kù)結(jié)構(gòu)發(fā)生變化或者重建時(shí),需要重新編程實(shí)現(xiàn)該過(guò)程。本課題研究的意義分布式數(shù)據(jù)庫(kù)大量的應(yīng)用,各種應(yīng)用之間又有很多的交叉性。數(shù)據(jù)庫(kù)同步就顯得很重要;特別是異構(gòu)的情況,然而異構(gòu)數(shù)據(jù)庫(kù)之間的同步不能應(yīng)用數(shù)據(jù)庫(kù)自帶的同步工具。另一方面,由于兩者分布在Internet中,防火墻的存在使得同步無(wú)法使用特定端口通訊。但因?yàn)榇蠖鄶?shù)企業(yè)會(huì)開(kāi)放用于HTTP的80端口,因而借助WebService可以完成兩者的通訊。數(shù)據(jù)表要進(jìn)行的操作,以XML形式編碼作為消息內(nèi)容。借助XML的無(wú)語(yǔ)言相關(guān)性、無(wú)平臺(tái)相關(guān)性、無(wú)對(duì)象相關(guān)性來(lái)實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫(kù)的同步,也可應(yīng)用結(jié)構(gòu)相同的分布式數(shù)據(jù)庫(kù)上。本課題的研究方法本同步系統(tǒng)采用WebService作為同步數(shù)據(jù)的傳輸,使用觸發(fā)器實(shí)時(shí)捕獲數(shù)據(jù)庫(kù)的增量記錄,并保存到臨時(shí)緩沖表,以便供同步到目標(biāo)數(shù)據(jù)庫(kù),然后采用Windows服務(wù)實(shí)時(shí)的監(jiān)視目標(biāo)IP是否有需要同步的數(shù)據(jù),如果存在目標(biāo)IP同步的數(shù)據(jù),就向此IP發(fā)送同步消息,另外一端收到同步消息就調(diào)用WebServcie方法獲取同步的數(shù)據(jù),寫入到本地,寫入成功后向服務(wù)器方發(fā)送確認(rèn)消息;服務(wù)器收到確認(rèn)后,將此IP同步了的數(shù)據(jù)標(biāo)識(shí)為已讀。當(dāng)所有主機(jī)同步完成,就物理上刪除被同步了的數(shù)據(jù)。先實(shí)現(xiàn)SqlServer2000同步到Oracle,設(shè)計(jì)時(shí)考慮到多個(gè)IP,多個(gè)不同異構(gòu)數(shù)據(jù)的情況。WebService數(shù)據(jù)庫(kù)同步原理WebService構(gòu)成與特點(diǎn)WebServcie的結(jié)構(gòu)服務(wù)提供者服務(wù)注冊(cè)中心服務(wù)提供者服務(wù)注冊(cè)中心服務(wù)請(qǐng)求者服務(wù)服務(wù)描述服務(wù)描述 發(fā)布綁定 查找 綁定查找 圖1WebService的結(jié)構(gòu)WebServcie的關(guān)鍵技術(shù)協(xié)議WebService中的主要服務(wù)協(xié)議包括:XML、SOAP、WSDL、UDDI,它們構(gòu)成一個(gè)互操作的協(xié)議棧。如圖2所示UDDIUDDI通用發(fā)現(xiàn)、描述、繼承WSDLWebService描述語(yǔ)言XML、HTTPSOAP簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議圖2WebService的協(xié)議棧XML(eXtensibleMarkupLanguage):可擴(kuò)展的置標(biāo)語(yǔ)言,是W3C組織于1998年2月發(fā)布的標(biāo)準(zhǔn)。XML嚴(yán)格地定義可移植的結(jié)構(gòu)化數(shù)據(jù),并對(duì)數(shù)據(jù)賦予上下文相關(guān)功能。Web服務(wù)完全基于XML技術(shù)。服務(wù)提供者和服務(wù)請(qǐng)求者均使用XML傳遞消息和數(shù)據(jù)流。SOAP(SimpleObjectAccessProtocol):簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議,SOAP完全獨(dú)立于任何廠商,可以相對(duì)于任何編程語(yǔ)言、對(duì)象模型、操作系統(tǒng)和平臺(tái)獨(dú)立實(shí)現(xiàn)。它為在分布式環(huán)境下使用XML、對(duì)等地交換結(jié)構(gòu)化和類型化的信息提供了一個(gè)簡(jiǎn)單且輕量級(jí)的機(jī)制。HTTP作為低層通信協(xié)議實(shí)現(xiàn)了SOAP把基于HTTP的Web技術(shù)與XML的靈活性和擴(kuò)展性結(jié)合在一起,并有助于實(shí)現(xiàn)異構(gòu)平臺(tái)之間的互相操作性,從而使其擴(kuò)展性結(jié)合在一起,并有助于實(shí)現(xiàn)異構(gòu)平臺(tái)之間的互操作性,從而使其擴(kuò)展到Internet上的分布式計(jì)算和數(shù)據(jù)集成。HTTP作為一種普遍接受的協(xié)議被用于任何地方及任何平臺(tái)上,XML也同HTTP一樣得到普遍應(yīng)用,由于XML是文本格式文件,所以SOAP實(shí)質(zhì)上是一個(gè)基于文本的協(xié)議,它沒(méi)有對(duì)平臺(tái)和環(huán)境的依賴性。WSDL(WebServcieDescriptionLanguage):Web服務(wù)描述語(yǔ)言,定義了一個(gè)基于XML的組件描述標(biāo)準(zhǔn)機(jī)制,用來(lái)描述Web服務(wù)的相關(guān)信息,它把網(wǎng)絡(luò)服務(wù)定義成一個(gè)能交換消息的通信端點(diǎn)集。用WSDL定義的一套XML語(yǔ)法描述的網(wǎng)絡(luò)服務(wù)的方式,使用戶端的程序要知道Web服務(wù)提供了什么服務(wù)可以進(jìn)行調(diào)用。UDDI(UniversalDescriptionDiscoveryandIntegration):通用描述、發(fā)現(xiàn)和集成協(xié)議,是一套基于Web的、分布式的、為Web服務(wù)提供信息注冊(cè)的實(shí)現(xiàn)標(biāo)準(zhǔn)規(guī)范,是一個(gè)跨產(chǎn)業(yè)、跨平臺(tái)的開(kāi)發(fā)性架構(gòu)。可幫助Web服務(wù)提供者在Internet上公布自己推出的Web服務(wù)。WebServcie的特點(diǎn)WebService技術(shù)的主要目標(biāo)就是在現(xiàn)有各種異種平臺(tái)的基礎(chǔ)上,構(gòu)筑一個(gè)通用的平臺(tái)無(wú)關(guān)、語(yǔ)言無(wú)關(guān)的技術(shù)層。各種不同平臺(tái)之上的應(yīng)用依靠這個(gè)技術(shù)層來(lái)實(shí)施彼此的連接和集成,從而讓使用不同系統(tǒng)和不同編程語(yǔ)言的人們能夠相互交流和分享數(shù)據(jù)。WebService并不是構(gòu)件技術(shù)發(fā)展中的一個(gè)革命性改變。而只是一種較大的進(jìn)展。它是對(duì)象構(gòu)件技術(shù)在Internet上的延伸,是一種部署在Web上的對(duì)象構(gòu)件。是封裝成單個(gè)實(shí)體并發(fā)布到網(wǎng)絡(luò)上供其它程序使用的功能集合,它不會(huì)完全取代現(xiàn)在的構(gòu)件技術(shù)。WebServcie安全考慮的安全僅僅是WebService在交換數(shù)據(jù)中的安全。因此,設(shè)定的安全目標(biāo)是:.客戶端確認(rèn)服務(wù)器的身份;.服務(wù)器來(lái)確認(rèn)客戶端的身份;.保證傳輸?shù)臄?shù)據(jù)在傳輸過(guò)程中不被監(jiān)聽(tīng);.保證傳輸?shù)臄?shù)據(jù)在傳輸過(guò)程中不被篡改。數(shù)據(jù)庫(kù)復(fù)制的分類數(shù)據(jù)庫(kù)復(fù)制有不同的分類方法,不同的分類采用的復(fù)制方法往往不同。按照復(fù)制的方向劃分為單向(unidirectional)復(fù)制和雙向(hi-directional)復(fù)制,按照傳播更新的方式劃分為同步(synchronous)復(fù)制和異步(asynchronous)復(fù)制。單向復(fù)制,也稱主從式(master/slave或primary/secondary)復(fù)制或主版本(mastercopy)復(fù)制,指的是兩個(gè)復(fù)制結(jié)點(diǎn)之間只從一個(gè)結(jié)點(diǎn)向另一個(gè)結(jié)點(diǎn)進(jìn)行復(fù)制,源結(jié)點(diǎn)保存復(fù)制對(duì)象,目標(biāo)結(jié)點(diǎn)保存復(fù)制對(duì)象的副本,源結(jié)點(diǎn)中數(shù)據(jù)對(duì)象具有可讀可寫的特性,目標(biāo)結(jié)點(diǎn)中的數(shù)據(jù)對(duì)象只具有可讀的特性,修改數(shù)據(jù)對(duì)象需要在源結(jié)點(diǎn)上進(jìn)行,從而預(yù)防了更新沖突的發(fā)生。這種復(fù)制方式比較簡(jiǎn)單,應(yīng)用范圍也比較廣。雙向復(fù)制也稱對(duì)等式(peer-to-peer)復(fù)制,多版本(multi-copy)復(fù)制或隨處修改(updateanywhere)復(fù)制,指的是兩個(gè)復(fù)制結(jié)點(diǎn)之間可以互相復(fù)制,復(fù)制結(jié)點(diǎn)既是源結(jié)點(diǎn)也是目標(biāo)結(jié)點(diǎn)。源結(jié)點(diǎn)和目標(biāo)結(jié)點(diǎn)上的復(fù)制對(duì)象都是可讀可寫的。在分布式環(huán)境下可能對(duì)同一復(fù)制對(duì)象同時(shí)進(jìn)行修改,所以在理論上存在沖突的可能性,因此雙向復(fù)制中的一個(gè)重要問(wèn)題就是如何檢測(cè)預(yù)防和解決復(fù)制中的沖突。雙向復(fù)制比單向復(fù)制更加復(fù)雜,實(shí)現(xiàn)難度也較大,但應(yīng)用的范圍要更廣泛一些,在移動(dòng)環(huán)境、動(dòng)態(tài)環(huán)境等場(chǎng)合下大多采用這種復(fù)制方式。同步復(fù)制又稱為急切(eager)復(fù)制,是在一個(gè)原子事務(wù)中同時(shí)更新所有的復(fù)制結(jié)點(diǎn),同步復(fù)制可以進(jìn)行序列化操作,但是在交互過(guò)程中需要更多的消息交互,從而降低了復(fù)制性能,也增加了事務(wù)執(zhí)行的響應(yīng)時(shí)間。同步復(fù)制不適合移動(dòng)應(yīng)用場(chǎng)合,因?yàn)橐苿?dòng)設(shè)備不可能保持實(shí)時(shí)的連接,通常采用另一種復(fù)制方法異步復(fù)制。異步復(fù)制又稱為懶惰(lazy)復(fù)制,是在本地事務(wù)提交以后再將本地?cái)?shù)據(jù)的變更反映到其他復(fù)制結(jié)點(diǎn)上,這種方式不需要實(shí)時(shí)的連接,可以很好的提高復(fù)制的性能,但異步復(fù)制的一個(gè)問(wèn)題是在復(fù)制結(jié)點(diǎn)中存在“臟”數(shù)據(jù),當(dāng)兩個(gè)事務(wù)在不同節(jié)點(diǎn)讀和寫數(shù)據(jù)時(shí),就無(wú)法保證事務(wù)的序列化,這種復(fù)制方式一般應(yīng)用在對(duì)數(shù)據(jù)一致性要求不是很高的地方。同步復(fù)制和異步復(fù)制的應(yīng)用場(chǎng)合不同。同步復(fù)制可以保證系統(tǒng)所有結(jié)點(diǎn)數(shù)據(jù)的實(shí)時(shí)一致性,對(duì)于銀行此類系統(tǒng)一般采用同步復(fù)制方法。異步復(fù)制無(wú)法保證數(shù)據(jù)的實(shí)時(shí)一致性,可以應(yīng)用在移動(dòng)設(shè)備數(shù)據(jù)復(fù)制,多級(jí)管理信息系統(tǒng)中。復(fù)制數(shù)據(jù)的類型數(shù)據(jù)庫(kù)復(fù)制需要在數(shù)據(jù)庫(kù)之間傳輸數(shù)據(jù)記錄,這些數(shù)據(jù)記錄是數(shù)據(jù)庫(kù)中記錄的一種劃分,這種劃分與數(shù)據(jù)庫(kù)中的記錄存在一定的邏輯關(guān)系,按照這種邏輯關(guān)系把復(fù)制數(shù)據(jù)分為以下幾種:全劃分:復(fù)制數(shù)據(jù)為數(shù)據(jù)庫(kù)中所有表中的所有記錄。數(shù)據(jù)庫(kù)中記錄的任意變化都需要進(jìn)行復(fù)制操作。水平劃分:復(fù)制數(shù)據(jù)只是表中的部分記錄,只對(duì)滿足復(fù)制條件的記錄進(jìn)行復(fù)制操作。垂直劃分:復(fù)制數(shù)據(jù)只是記錄的部分字段,不需要對(duì)全部改變的字段值進(jìn)行復(fù)制操作。水平垂直劃分:復(fù)制數(shù)據(jù)是水平劃分和垂直劃分的組合。函數(shù)統(tǒng)計(jì)劃分:復(fù)制數(shù)據(jù)是對(duì)記錄進(jìn)行統(tǒng)計(jì)運(yùn)算的結(jié)果。復(fù)制數(shù)據(jù)的不同劃分用于不同的場(chǎng)合。對(duì)于緩存數(shù)據(jù)庫(kù)或備份數(shù)據(jù)庫(kù)一般采用全劃分的方式,所有的數(shù)據(jù)都進(jìn)行復(fù)制。水平和垂直劃分對(duì)數(shù)據(jù)進(jìn)行了過(guò)濾操作,往往用在數(shù)據(jù)保密,分級(jí)管理方面,可以提高復(fù)制的效率,降低不必要的數(shù)據(jù)傳輸。函數(shù)統(tǒng)計(jì)劃分主要用在基礎(chǔ)數(shù)據(jù)不全或者特定情況下不能傳輸基礎(chǔ)數(shù)據(jù)而只能傳輸統(tǒng)計(jì)數(shù)據(jù)的情況下,這種方式可以大大的降低數(shù)據(jù)傳輸量,同時(shí)可以直接利用統(tǒng)計(jì)數(shù)據(jù),而無(wú)需每次都通過(guò)基礎(chǔ)數(shù)據(jù)來(lái)生成統(tǒng)計(jì)數(shù)據(jù),提高了數(shù)據(jù)庫(kù)的性能,滿足了統(tǒng)計(jì)方面的需求。復(fù)制數(shù)據(jù)按照傳輸數(shù)據(jù)的形式分為完整拷貝(fullcopy),增量修改(incremental-update),凈變化(neatchange)三種。完整拷貝方式:源數(shù)據(jù)庫(kù)中所有的記錄都傳送到目標(biāo)數(shù)據(jù)庫(kù)中。完整拷貝的優(yōu)點(diǎn)是實(shí)現(xiàn)起來(lái)簡(jiǎn)單容易,不占用額外資源,不需要進(jìn)行沖突檢測(cè)等方面的工作,但其缺點(diǎn)是效率較低,只能應(yīng)用在初始化復(fù)制、崩潰恢復(fù)等場(chǎng)合。增量修改方式,也稱標(biāo)量(scalable)方式:在這種方式下需要將事務(wù)對(duì)數(shù)據(jù)的操作內(nèi)容全部保存下來(lái),傳輸?shù)臄?shù)據(jù)就是操作的完整序列。增量修改的最大優(yōu)點(diǎn)就是滿足復(fù)制的單副本可串行性化。這種方式能夠提供詳細(xì)的控制信息,適用于多種復(fù)制方式,但保存全部的操作序列需要較多的資源,設(shè)計(jì)通用的存儲(chǔ)結(jié)構(gòu)也較復(fù)雜。凈變化方式:傳輸?shù)臄?shù)據(jù)為兩次復(fù)制之間更新數(shù)據(jù)的凈變化值。這種方式需要記錄上一次復(fù)制的狀態(tài),在下一次復(fù)制時(shí)將上次復(fù)制以來(lái)的所有變化數(shù)據(jù)從數(shù)據(jù)庫(kù)中提取出來(lái)作為復(fù)制數(shù)據(jù)項(xiàng)。凈變化方式只傳輸改變的數(shù)據(jù),因此傳輸?shù)臄?shù)據(jù)量是最小的,實(shí)現(xiàn)方法也較簡(jiǎn)單,可以明顯的提高復(fù)制性能,但是這種方式不是以事務(wù)為依據(jù)對(duì)數(shù)據(jù)進(jìn)行劃分,所以不能用于同步復(fù)制,在數(shù)據(jù)復(fù)制的過(guò)程中也存在一定的問(wèn)題。數(shù)據(jù)捕獲技術(shù)復(fù)制數(shù)據(jù)和數(shù)據(jù)捕獲技術(shù)有一定的相關(guān)性,不同種的數(shù)據(jù)捕獲技術(shù)在生成復(fù)制數(shù)據(jù)的能力方面上有所不同。現(xiàn)在常用的數(shù)據(jù)捕獲技術(shù)包括觸發(fā)器法、快照法、控制表變化法等??煺辗煺?snapshot)是在某一時(shí)刻將數(shù)據(jù)庫(kù)中存儲(chǔ)對(duì)象的狀態(tài)存儲(chǔ)下來(lái),構(gòu)成當(dāng)前數(shù)據(jù)庫(kù)的一個(gè)映像文件,將此映像文件作為復(fù)制數(shù)據(jù),用來(lái)更新其他的數(shù)據(jù)庫(kù)。快照法只是在復(fù)制時(shí)進(jìn)行一次全面掃描,實(shí)現(xiàn)簡(jiǎn)單,它不需依賴特別的機(jī)制,也不占用系統(tǒng)資源,在復(fù)制初始化和崩潰恢復(fù)時(shí)通常需要采用這種方式。由于快照法生成完全拷貝的復(fù)制數(shù)據(jù),因此效率很低,應(yīng)用的范圍也比較小。Oracle和MSSQLServer數(shù)據(jù)庫(kù)明確提供了基于快照的捕獲方法。一般的復(fù)制方案在初始化時(shí)往往也使用這種方法。觸發(fā)器法:觸發(fā)器是一種特殊類型的存儲(chǔ)過(guò)程,當(dāng)使用UPDATE、INSERT或DELETE對(duì)指定數(shù)據(jù)表中數(shù)據(jù)進(jìn)行操作時(shí),觸發(fā)器就會(huì)生效,通過(guò)分析操作的相關(guān)信息,可以在觸發(fā)器中定義復(fù)雜的業(yè)務(wù)規(guī)則。觸發(fā)器法就是通過(guò)捕獲這些操作并將數(shù)據(jù)操作的信息保存到日志中或者直接進(jìn)行復(fù)制操作。如圖3觸發(fā)器數(shù)據(jù)捕捉方式所示。觸發(fā)器法避免了不必要的數(shù)據(jù)傳輸,克服了基于快照法的主要缺點(diǎn),大大提高了效率,可以用于同步復(fù)制和雙向復(fù)制。但是觸發(fā)器機(jī)制需要數(shù)據(jù)庫(kù)系統(tǒng)的支持,并且為了支持不同的復(fù)制數(shù)據(jù)類型,復(fù)制方法需要設(shè)置不同的觸發(fā)器腳本,給系統(tǒng)維護(hù)和變更帶來(lái)了不便。圖3觸發(fā)器數(shù)據(jù)捕捉方式由于大型數(shù)據(jù)庫(kù)系統(tǒng)基本上都提供了完善的觸發(fā)器機(jī)制,因此大型數(shù)據(jù)庫(kù)廠商提供的數(shù)據(jù)庫(kù)復(fù)制方案往往都運(yùn)用了這種捕獲方法,如Oracle的對(duì)稱復(fù)制(SymmetricReplication)綜合應(yīng)用了快照和觸發(fā)器兩種捕獲方法??刂票碜兓刂票碜兓?ControlTableChange)法就是創(chuàng)建一張包含復(fù)制源表的主鍵字段和一些控制信息字段的控制表,當(dāng)復(fù)制表中的記錄發(fā)生變化時(shí),則修改控制表中相應(yīng)關(guān)鍵字的記錄,在控制信息字段中記錄變化的情況,這一過(guò)程可以通過(guò)觸發(fā)器,中間件來(lái)實(shí)現(xiàn),復(fù)制數(shù)據(jù)可以根據(jù)控制表中記錄的變化情況生成。通過(guò)控制表變化法得到的復(fù)制數(shù)據(jù)是數(shù)據(jù)庫(kù)的凈變化,效率較高,由于只保存了主鍵信息和部分控制信息,所以在空間占用方面也較小??刂票碜兓蛇m用于除同步復(fù)制以外的各種復(fù)制形式。上述的幾種數(shù)據(jù)捕獲方法各有優(yōu)缺點(diǎn),需要結(jié)合你的具體應(yīng)用具體的選擇。沖突檢測(cè)數(shù)據(jù)庫(kù)復(fù)制采用不同的復(fù)制方式,復(fù)制不同類型的數(shù)據(jù)都會(huì)在復(fù)制中產(chǎn)生各種不同的沖突。下面是幾種常見(jiàn)的沖突。表間沖突:復(fù)制數(shù)據(jù)不能滿足本地?cái)?shù)據(jù)庫(kù)表上定義的約束條件而造成的沖突。進(jìn)行復(fù)制數(shù)據(jù)設(shè)計(jì)時(shí)需要考慮表上定義的完整性約束,引用約束等,否則在進(jìn)行數(shù)據(jù)復(fù)制時(shí)會(huì)因?yàn)檫@些約束無(wú)法導(dǎo)入數(shù)據(jù)。凈變化方式不滿足單副本可串行化,在進(jìn)行數(shù)據(jù)更新時(shí)需要更多的考慮表間沖突問(wèn)題。唯一性沖突:發(fā)生在一個(gè)更新產(chǎn)生了一個(gè)違反主鍵或唯一性約束時(shí)。不同的結(jié)點(diǎn)根據(jù)本地?cái)?shù)據(jù)庫(kù)規(guī)則設(shè)置數(shù)據(jù),這時(shí)不合理的主鍵生成規(guī)則或者是錯(cuò)誤的輸入都有可能產(chǎn)生主鍵沖突或者是唯一性沖突。更新沖突:對(duì)于異步更新,本地?cái)?shù)據(jù)的更新和遠(yuǎn)程數(shù)據(jù)的更新存在時(shí)間差,在這種情況下兩個(gè)或多個(gè)復(fù)制站點(diǎn)可能同時(shí)更新一條記錄,如果更新同一條記錄的相關(guān)字段就會(huì)存在列級(jí)沖突。刪除沖突:發(fā)生在一個(gè)結(jié)點(diǎn)更新另一個(gè)結(jié)點(diǎn)已刪除的一行時(shí),或者同一條記錄在不同的復(fù)制站點(diǎn)被刪除時(shí)。需求分析為了明確系統(tǒng)的應(yīng)達(dá)到的目標(biāo),確定系統(tǒng)必須做什么,清楚地理解所要解決的問(wèn)題。在下面描述軟件的功能和性能的需求。確定了軟件設(shè)計(jì)的約束。同步環(huán)境本系統(tǒng)的同步環(huán)境如圖4:圖4同步環(huán)境 Oracle9i,mySQL等不同類型的數(shù)據(jù)庫(kù)通過(guò)Internet來(lái)獲取SQLServer2000的數(shù)據(jù),通信的兩端都存在防火墻,提供了一臺(tái)Web服務(wù)器用于發(fā)布WebService。功能需求本設(shè)計(jì)要實(shí)現(xiàn)的功能:能夠使處于Internet上的異構(gòu)數(shù)據(jù)庫(kù)的單向同步功能,初步先實(shí)現(xiàn)SqlServer2000向Oracle與的同步,需要考慮其它數(shù)據(jù)庫(kù)的情況比如mySql等。同步數(shù)據(jù)需要可靠的傳輸,保證數(shù)據(jù)能夠準(zhǔn)確、完全的傳輸?shù)奖煌降囊环?。同步需要一定安全性,能夠按照進(jìn)行同步IP或則物理地址來(lái)驗(yàn)證同步身份。由于數(shù)據(jù)在Internet上傳輸,必須保證同步數(shù)據(jù)的傳輸開(kāi)銷小,安全等。能夠?qū)崿F(xiàn)不同主機(jī)的多個(gè)數(shù)據(jù)庫(kù)同時(shí)同步功能。對(duì)實(shí)時(shí)性同步、定期同步可配置,既可以選擇實(shí)時(shí)同步、手動(dòng)同步或則按需要同步的數(shù)據(jù)量來(lái)同步。同步信息可以配置性。同步信息包括:同步的字段、字段類型、同步的表、分配了權(quán)限的同步主機(jī)等。同步的數(shù)據(jù)類型能夠是不同的類型,比如數(shù)值型向字符型的同步等。能夠?qū)ν降哪硞€(gè)字段做特殊的處理后再同步。既是能夠?qū)崿F(xiàn)多個(gè)字段合并為一個(gè)字段,或則一個(gè)、多個(gè)字段分解為更多個(gè)字段。同步的配置界面化,操作方便、易使用。對(duì)網(wǎng)絡(luò)連接斷開(kāi)后能夠保證同步數(shù)據(jù)的不丟失,網(wǎng)絡(luò)連上后能接著繼續(xù)同步。對(duì)異常的信息提示盡量多,比如配置系統(tǒng)時(shí)對(duì)不正確的配置及時(shí)提示,以便產(chǎn)生同步的異常。當(dāng)是多個(gè)數(shù)據(jù)庫(kù)同步到一個(gè)數(shù)據(jù)庫(kù)時(shí)需要解決同步?jīng)_突。系統(tǒng)需要有一定擴(kuò)展性。性能需求精度:服務(wù)器端的增量數(shù)據(jù)能夠準(zhǔn)確的同步到客戶端,不應(yīng)該存在數(shù)據(jù)被截?cái)嗟那闆r。數(shù)據(jù)傳輸過(guò)程中對(duì)數(shù)據(jù)丟失的情況,應(yīng)該不影響同步數(shù)據(jù)的完整性。時(shí)間特性要求: 同步操作對(duì)其它正常的數(shù)據(jù)庫(kù)應(yīng)用,無(wú)明顯性能降低現(xiàn)象。 對(duì)配置了實(shí)時(shí)性同步的,同步延遲應(yīng)小于1分鐘(除網(wǎng)絡(luò)斷開(kāi)等異常情況)。靈活性同步的字段可動(dòng)態(tài)配置,當(dāng)添加、修改字段后可以通過(guò)簡(jiǎn)單的配置來(lái)實(shí)現(xiàn)修改后的同步。輸入輸出要求輸入:服務(wù)器端數(shù)據(jù)的改變。處理:字段合并,分解或者是一定的運(yùn)算加工。輸出:將處理了的數(shù)據(jù)更新到客戶端。運(yùn)行需求硬件環(huán)境需求:客戶端、服務(wù)器端:專用數(shù)據(jù)庫(kù)服務(wù)器,P4以上,512M以上內(nèi)存,80G以上硬盤;Internet網(wǎng)絡(luò)連接。軟件環(huán)境:源端:Windows2003/XP操作系統(tǒng)、SqlServer2000數(shù)據(jù)庫(kù)、IIS5.0、.NETFramework1.1。目標(biāo)端:Windows2003/XP操作系統(tǒng)、數(shù)據(jù)庫(kù)環(huán)境、.NETFramework1.1。方案設(shè)計(jì)結(jié)合前面的同步原理,以及需求的介紹,下面給出同步的方案設(shè)計(jì):數(shù)據(jù)庫(kù)同步復(fù)制模型模型包括源結(jié)點(diǎn)和目標(biāo)結(jié)點(diǎn)兩大塊。源結(jié)點(diǎn)模塊包括:數(shù)據(jù)庫(kù)捕獲模塊、數(shù)據(jù)生成模塊、WebService、同步控制模塊、定時(shí)器、配置模塊等組成。目標(biāo)結(jié)點(diǎn)包括:數(shù)據(jù)庫(kù)同步控制模塊、數(shù)據(jù)導(dǎo)入模塊、配置模塊。如圖5所示。圖5系統(tǒng)模塊數(shù)據(jù)庫(kù)設(shè)計(jì)系統(tǒng)包括源端數(shù)據(jù)庫(kù)設(shè)計(jì)以及目的端數(shù)據(jù)庫(kù)設(shè)計(jì)。源結(jié)點(diǎn)SqlServer2000表設(shè)計(jì)E-R圖如圖6圖6E-R圖數(shù)據(jù)表如表1:表1:tLJ(數(shù)據(jù)表)邏輯字段名物理字段名字段類型是否為空主鍵外鍵說(shuō)明編號(hào)IintNOTNULLYesNo自增加姓名NameVarchar(20)NOTNULLNoNo描述DesVARCHAR(1000)NULLNoNo年齡AgeintNULLNoNo控制表如表2、表3、表4、表5:表2同步緩沖臨時(shí)表:tTemp邏輯字段名物理字段名字段類型是否為空主鍵外鍵說(shuō)明編號(hào)IintNOTNULLYesNo動(dòng)作標(biāo)識(shí)SigntinyintnullNoNo插入1,刪除2,更新3數(shù)據(jù)表名tableNameVARCHAR(20)NULLNoNo數(shù)據(jù)表的表名數(shù)據(jù)記錄主鍵infoIDintNotnullnono數(shù)據(jù)表的記錄主鍵寫入時(shí)間InsertDateDateTimeNULLNoNo表3讀取狀態(tài)表:tReadState邏輯字段名物理字段名字段類型是否為空主鍵外鍵說(shuō)明編號(hào)IintNOTNULLYesNo讀取了數(shù)據(jù)的IPIPtinyintnullNoYestIPConfig.I的外鍵同步緩沖IDinfoIDintNotnullnoYes數(shù)據(jù)表的記錄表4同步IP配置表:tIPConfig邏輯字段名物理字段名字段類型是否為空主鍵外鍵說(shuō)明編號(hào)IintNOTNULLYesNo自增加要同步的IPIPVarcahr(14)nullNoNo開(kāi)啟狀態(tài)isOpenintNotnullnono上次讀取時(shí)間ReadDateDatetimeNotnullNono表5讀取緩沖表:tReadTemp邏輯字段名物理字段名字段類型是否為空主鍵外鍵說(shuō)明編號(hào)IintNOTNULLYesNo自增加讀取ipIPtinyintnullNoNo與tIPConfig.I關(guān)聯(lián)同步緩沖表編號(hào)InfoIdintNotnullnoNo同步緩沖表編號(hào)讀取時(shí)間CreateDateDatetimeNotnullNoNo讀取秩序號(hào)ReadNointNotnullNoNo目的結(jié)點(diǎn)Oracle表設(shè)計(jì)表6:tLJ邏輯字段名物理字段名字段類型是否為空主鍵外鍵說(shuō)明編號(hào)INumber(22)NOTNULLYesNo姓名NameVarchar2(50)NOTNULLNoNo描述DesVARCHAR2(1000)NULLNoNo年齡AgeNumber(22)NULLNoNo 表7:CopyT1邏輯字段名物理字段名字段類型是否為空主鍵外鍵說(shuō)明編號(hào)IVARCHAR2(50)NOTNULLnoNo姓名,年齡NameAgeVarcahr2(100)NULLNoNo年齡DesVarcahr2(1000)NOTNULLNoNo模塊設(shè)計(jì)該模型按照功能劃分為三個(gè)部分,一是數(shù)據(jù)捕獲部份,二是同步部份,三是沖突檢測(cè)處理部份(如圖7)。沖突檢測(cè)沖突檢測(cè)捕獲同步圖7模塊圖數(shù)據(jù)捕獲部分包含數(shù)據(jù)捕獲模塊和控制變化表兩個(gè)部分。數(shù)據(jù)捕獲模塊采用基于觸發(fā)器的方式進(jìn)行數(shù)據(jù)的捕獲??刂票碛脕?lái)保存數(shù)據(jù)庫(kù)操作的歷史記錄,其基本思想來(lái)源于控制表變化法,即在這些表中記錄每次更新記錄的主鍵信息、表名等,這種數(shù)據(jù)捕獲方式獲得的是復(fù)制數(shù)據(jù)的凈變化,可以大大的降低網(wǎng)絡(luò)傳輸量,提高復(fù)制性能??刂谱兓淼母袷饺缟稀唇Y(jié)點(diǎn)SqlServer2000表設(shè)計(jì)’。同步緩沖臨時(shí)表tTemp:用于記錄數(shù)據(jù)表記錄主鍵、數(shù)據(jù)表記錄表名,記錄寫入時(shí)間等。當(dāng)數(shù)據(jù)表有被修改、添加、刪除時(shí)觸發(fā)器就向此表寫入更新記錄id等信息。如果是更新sign字段的值為3,刪除時(shí)sign值為2,插入時(shí)sign值為1,當(dāng)某條記錄在某一時(shí)間段內(nèi)被重復(fù)操作了多次時(shí)sign字段的值始終保存追后一次的操作。同步部分包括定時(shí)器、同步控制模塊、數(shù)據(jù)導(dǎo)入、WebServcie、驗(yàn)證模塊。定時(shí)器定時(shí)器包含于一個(gè)Windows服務(wù)中,每隔一定的時(shí)間檢測(cè)IP配置表里被開(kāi)啟IP是否有同步的數(shù)據(jù)。如果存在同步的數(shù)據(jù)就啟動(dòng)同步控制模塊。通過(guò)IP配置表可以授權(quán)某個(gè)主機(jī)來(lái)獲取同步數(shù)據(jù)。從而起到一定的安全性與高性能。同步控制模塊:在源結(jié)點(diǎn)端在源節(jié)點(diǎn)端當(dāng)定時(shí)器通過(guò)驗(yàn)證模塊檢查到某個(gè)IP有要同步的數(shù)據(jù)時(shí),就啟動(dòng)一個(gè)服務(wù)線程,并向這個(gè)IP的特定端口發(fā)送Socket消息,并等待這個(gè)IP返回同步成功的確認(rèn)消息。當(dāng)收到確認(rèn)消息后(此確認(rèn)消息包含一個(gè)同步批次號(hào)也就是“讀取緩沖表:tReadTemp”中的“讀取秩序號(hào):ReadNo”,“讀取緩沖表”是在目標(biāo)端讀取數(shù)據(jù)后寫入的,在后面將要介紹到),然后源端控制模塊操縱同步控制表將讀取了的記錄關(guān)鍵字以及目的端IP寫入“讀取狀態(tài)表:tReadState”表示本批次記錄的這個(gè)目的端已經(jīng)讀取、下次不在讀取。當(dāng)所有的配置表里的目標(biāo)端都完成同步后,就物理上刪除控制表里的相關(guān)記錄。在目標(biāo)端 目的端在啟動(dòng)了以后就一直監(jiān)聽(tīng)源端是否有同步信號(hào)(監(jiān)聽(tīng)的源端IP以及端口能夠通過(guò)讀取本地的XML配置文件得到),當(dāng)監(jiān)聽(tīng)到同步信號(hào),創(chuàng)建一個(gè)線程來(lái)啟動(dòng)“數(shù)據(jù)導(dǎo)入模塊”,在“數(shù)據(jù)導(dǎo)入模塊”處理完畢后向源端發(fā)送確認(rèn)消息,此確認(rèn)消息包含“數(shù)據(jù)導(dǎo)入模塊”導(dǎo)入成功與否的標(biāo)識(shí),如果正常導(dǎo)入此消息就是同步的序號(hào)也就是上面提到的同步批次號(hào)。數(shù)據(jù)導(dǎo)入與本模塊相管的XML配置文件如下:<?xmlversion="1.0"encoding="gb2312"?><appConfig><Tname="T1*tLJ"> <fieldsname="I*varchar2*50"sqlName="I*int*4"></fields> <fieldsname="age*varchar2*100"sqlName="age*int*4"></fields><fieldsname="des*varchar2*1000"sqlName="des*varchar*50|DES*varchar*1000"></fields></T><Tname="TLJ*tLJ"> <fieldsname="I*NUMBER*22"sqlName="I*int*4"></fields> <fieldsname="age*NUMBER*22"sqlName="age*int*4"></fields> <fieldsname="des*varchar2*1000"sqlName="des*varchar*1000"></fields> <fieldsname="name*varchar2*50"sqlName="name*varchar*50"></fields></T></appConfig>其中每個(gè)結(jié)點(diǎn)T表示需要與源端同步的一張表,name屬性給出了同步表的對(duì)應(yīng)關(guān)系,結(jié)點(diǎn)T的子結(jié)點(diǎn)fields記錄了同步表中對(duì)應(yīng)的字段名,字段類型,字段大小等。通過(guò)此配置文件能夠?qū)θ珓澐帧⑺絼澐?、垂直劃分、水平垂直劃分、函?shù)統(tǒng)計(jì)劃分等不同復(fù)制數(shù)據(jù)類型的支持。開(kāi)始執(zhí)行時(shí),就先遍歷此XML文檔,有多少個(gè)T結(jié)點(diǎn)就循環(huán)多少次來(lái)實(shí)現(xiàn)從源端提供的WebService讀取數(shù)據(jù),讀取數(shù)據(jù)時(shí)需要傳入要讀取的表名以及目的端的IP,然后根據(jù)配置文件中的字段對(duì)應(yīng)關(guān)系,經(jīng)過(guò)類型轉(zhuǎn)換處理、合并分解處理后,寫入到本地。寫入到本地時(shí)由于在源端,對(duì)數(shù)據(jù)庫(kù)記錄的操作都記錄在控制變化表中,復(fù)制數(shù)據(jù)就是依據(jù)這些表加以確定,但從控制變化表中獲得的是數(shù)據(jù)的凈變化,無(wú)法保證單副本可串行化,在進(jìn)行數(shù)據(jù)導(dǎo)入時(shí)就會(huì)由于數(shù)據(jù)庫(kù)中定義的外鍵約束出現(xiàn)表間沖突,一種解決的方式就是在導(dǎo)入數(shù)據(jù)時(shí)臨時(shí)禁用數(shù)據(jù)庫(kù)的外鍵檢查功能。大型的數(shù)據(jù)庫(kù)系統(tǒng)一般都提供了禁用外鍵檢查的功能,如在MSSQLServer2000中可以使用通過(guò)命令在進(jìn)行導(dǎo)入時(shí)臨時(shí)禁用數(shù)據(jù)庫(kù)的外鍵檢查功能,在完成以后再恢復(fù)外鍵檢查,但是在恢復(fù)外鍵檢查功能時(shí),數(shù)據(jù)庫(kù)會(huì)自動(dòng)對(duì)整個(gè)數(shù)據(jù)庫(kù)進(jìn)行一遍外鍵檢查,這樣會(huì)帶來(lái)比較大的性能問(wèn)題,特別是在數(shù)據(jù)量比較大時(shí)這種開(kāi)銷往往無(wú)法接受,而且這種檢查是完全沒(méi)有必要的。除了臨時(shí)禁用外鍵檢查功能以外,還有一種方式是完全取消數(shù)據(jù)庫(kù)系統(tǒng)提供的外鍵檢查功能,即不在數(shù)據(jù)表上定義外鍵約束,而是通過(guò)觸發(fā)器等方式實(shí)現(xiàn)外鍵檢查。在進(jìn)行數(shù)據(jù)導(dǎo)入時(shí)可以設(shè)置標(biāo)志位說(shuō)明不進(jìn)行外鍵檢查,這樣就可以暫時(shí)忽略外鍵約束,但每次外鍵檢查都需要查詢外鍵表,這種實(shí)現(xiàn)方式會(huì)比數(shù)據(jù)庫(kù)本身提供的外鍵檢查付出更大的代價(jià),因此提出兩步法生成凈變化方式下無(wú)外鍵沖突的復(fù)制數(shù)據(jù)。第一步是生成無(wú)外鍵值的操作序列SN,第二步生成只包含外鍵值的更新序列SU。在導(dǎo)入序列SN時(shí)需要保證外鍵字段允許為空,如果根據(jù)業(yè)務(wù)規(guī)則允許外鍵字段為空,那么就不需要做額外的工作,否則需要在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)將外鍵字段設(shè)置允許空,然后通過(guò)觸發(fā)器等方式在數(shù)據(jù)更新時(shí)進(jìn)行檢查,這種方式只需要檢查值是否為空,代價(jià)要遠(yuǎn)遠(yuǎn)小于檢查外鍵表。根據(jù)兩步法生成同步數(shù)據(jù)的步驟是:從WebServcie得到的數(shù)據(jù)中分離出外鍵,分別用兩個(gè)虛擬表按順序保存外鍵置為空的數(shù)據(jù)T1與僅外鍵與主鍵T2。然后寫入T1。根據(jù)T2中的主鍵更新外鍵數(shù)據(jù)。WebService提供一個(gè)可供Internet上調(diào)用的數(shù)據(jù)發(fā)布方法,發(fā)布的數(shù)據(jù)是以XML序列化的形式傳輸?shù)?、便于不同平臺(tái)的互相操作。通過(guò)傳入ip、表名控制讀取同步的數(shù)據(jù)此ip應(yīng)該讀的數(shù)據(jù),并且將讀取了的數(shù)據(jù)主鍵的信息保存到“讀取緩沖表:tReadTemp”,如果是在配置表里無(wú)配置則不能讀取數(shù)據(jù)。讀取步驟:目的方調(diào)用WebService方法傳入目的IP,要同步的表名。WebServcie根據(jù)傳入的參數(shù),先判斷是否是系統(tǒng)的“合法用戶”,如果是合法的身份就先得到本次讀取的編號(hào),此讀取編號(hào)是“讀取緩沖表:tReadTemp”表中的“讀取秩序號(hào):ReadNo”的最大值加1得到的。供以后同步控制用。然后根據(jù)讀取“同步緩沖臨時(shí)表:tTemp”表中記錄的數(shù)據(jù)表里的主鍵來(lái)讀取數(shù)據(jù)。讀取的數(shù)據(jù)是在“讀取狀態(tài)表:tReadState”表里無(wú)本IP記錄的記錄。將上步讀了的數(shù)據(jù)保存到“讀取緩沖表:tReadTemp”里,如果在tReadTemp表里存在該信息主鍵就更新這條記錄的讀取時(shí)間和讀取秩序號(hào)為當(dāng)前讀取時(shí)間和讀取秩序號(hào)。驗(yàn)證模塊 驗(yàn)證模塊應(yīng)用在源端的同步控制模塊和目的端的數(shù)據(jù)導(dǎo)入模塊,主要完成控制特定IP來(lái)同步數(shù)據(jù),提高安全性與性能。沖突檢測(cè)處理部分異步復(fù)制存在的一個(gè)主要問(wèn)題就是沖突問(wèn)題,前面已經(jīng)說(shuō)明了常見(jiàn)的幾種沖突,在上面的同步部分也通過(guò)設(shè)計(jì)避免了其中的一種沖突,但對(duì)于其他沖突還需要采用其他的方法進(jìn)行解決。沖突檢測(cè)和處理部分就是在數(shù)據(jù)導(dǎo)入過(guò)程中檢測(cè)各種可能的沖突。代碼實(shí)現(xiàn)開(kāi)發(fā)環(huán)境開(kāi)發(fā)平臺(tái)的選擇:本系統(tǒng)的開(kāi)發(fā)平臺(tái)選擇微軟公司的.NET,開(kāi)發(fā)工具采用ASP.NET。.NET是Microsoft面向XMLWeb服務(wù)的平臺(tái),由框架、Web服務(wù)、.NET企業(yè)服務(wù)器等幾部分組成,提供涉及面較廣、功能較全面的解決方案。XMLWeb服務(wù)使應(yīng)用程序能夠共享數(shù)據(jù),可以跨平臺(tái)和操作系統(tǒng)。數(shù)據(jù)庫(kù)選擇:根據(jù)需求分析選擇了SqlServer2000+Oracle9i的組合。關(guān)鍵代碼詳解。數(shù)據(jù)捕獲部分這部份的功能就是動(dòng)態(tài)的捕獲數(shù)據(jù)表里數(shù)據(jù)的變化,其主要的實(shí)現(xiàn)就是在數(shù)據(jù)表上定義一個(gè)觸發(fā)器用于記錄本表的凈變化。此觸發(fā)器如下:ALTERTRIGGERtlj_TriggerONdbo.tlj--數(shù)據(jù)表FORINSERT,UPDATE,DELETEASbegin IFEXISTS(select*fromdeleted)andexists(select*frominserted) begin--更新deletefromdbo.tTempwhereinfoIDin(selectIfrominserted)andTableName='dbo.tlj'insertintodbo.tTemp(infoID,TableName,[Sign])selectI,'dbo.tlj',3frominserted end elseifnotEXISTS(select*fromdeleted)andexists(select*frominserted) begin--插入insertintodbo.tTemp(infoID,TableName,[Sign])selectI,'dbo.tlj',1frominserted end elseifEXISTS(select*fromdeleted)andnotexists(select*frominserted) begin--刪除 deletefromdbo.tTempwhereinfoIDin(selectIfromdeleted)andTableName='dbo.tlj'insertintodbo.tTemp(infoID,TableName,[Sign])selectI,'dbo.tlj',2fromdeletedendend當(dāng)更新、刪除數(shù)據(jù)表時(shí),先根據(jù)數(shù)據(jù)表關(guān)鍵字與數(shù)據(jù)表名稱刪除“同步緩沖臨時(shí)表:tTemp”里有的記錄,然后將被修改、刪除的數(shù)據(jù)表關(guān)鍵字、表名、修改刪除的標(biāo)識(shí)寫入tTemp表。當(dāng)向數(shù)據(jù)表新增加記錄時(shí)只要寫入tTemp表即可。同步部分同步控制模塊源端:主要包含于Windows服務(wù)里,通過(guò)Timer的執(zhí)行函數(shù)調(diào)用。其關(guān)鍵代碼如下: publicstaticstringOpenConn(stringIP,stringPort) { stringstrResult="-4,-3,-5,-2,-1"; IPAddressHostAddr=IPAddress.Parse(IP); IPEndPointhost=newIPEndPoint(HostAddr,int.Parse(Port));Sockets=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); try { s.Connect(host); } catch{returnIP;}//連接失敗 stringtmpstr="1"; byte[]sendBytes=Encoding.ASCII.GetBytes(tmpstr.ToCharArray()); try { s.Send(sendBytes,sendBytes.Length,0); } catch{return"-1";}//發(fā)送數(shù)據(jù)失敗 intbytes=0; byte[]recBytes=newbyte[256]; stringrecString=""; try { bytes=s.Receive(recBytes,recBytes.Length,0); } catch{return"-2";}//接受數(shù)據(jù)失敗 recString=Encoding.ASCII.GetString(recBytes,0,bytes); if(recString.Length>0&&strResult.IndexOf(recString)!=0) {SqlHelper.myExec("execdbo.prReadTempToReadState'"+IP+"',"+recString); } s.Close(); System.Threading.Thread.CurrentThread.Abort();//終止當(dāng)前線程 returnrecString; }通過(guò)Timer的執(zhí)行函數(shù)傳入同步的目的IP、端口創(chuàng)建Socket對(duì)象、建立連接,然后發(fā)送同步信號(hào),等待目的端的返回信號(hào),如果返回的數(shù)據(jù)不包含錯(cuò)誤消息就標(biāo)識(shí)本次已經(jīng)讀取的信息到讀取狀態(tài)表。然后終止當(dāng)前線程。目的端:用控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)了本部分,程序一啟動(dòng)就開(kāi)始處于監(jiān)聽(tīng)狀態(tài),接收源端發(fā)來(lái)同步信號(hào),并負(fù)責(zé)啟動(dòng)數(shù)據(jù)寫入模塊。數(shù)據(jù)導(dǎo)入本部分負(fù)責(zé)調(diào)用WebService方法獲取數(shù)據(jù)合并、分解處理后將數(shù)據(jù)寫入Oracle數(shù)據(jù)庫(kù)。WebService存在于源端的WebService項(xiàng)目里其主要方法:[WebMethod]publicDataSetProvider(stringIP,T){ DataSetds=DataOpt.myDataSet("execdbo.LJReadByIP'"+IP+"',’"+T+"'); returnds;}在調(diào)用此方法時(shí)需要添加Web引用地址如下:http://localhost/DataSynchronize/DataProvide.asmx存儲(chǔ)過(guò)程dbo.LJReadByIP根據(jù)傳入的參數(shù),先判斷是否是系統(tǒng)的“合法用戶”,如果是合法的身份就先得到本次讀取的編號(hào),此讀取編號(hào)是”讀取緩沖表:tReadTemp”表中的“讀取秩序號(hào):ReadNo”的最大值加1得到的。供以后同步控制用。然后根據(jù)讀取“同步緩沖臨時(shí)表:tTemp”表中記錄的數(shù)據(jù)表里的主鍵來(lái)讀取數(shù)據(jù)。讀取的數(shù)據(jù)是在“讀取狀態(tài)表:tReadState”表里無(wú)本IP記錄的記錄。將讀了的數(shù)據(jù)保存到”讀取緩沖表:tReadTemp”里,如果在tReadTemp表里存在該信息主鍵就更新這條記錄的讀取時(shí)間和讀取秩序號(hào)為當(dāng)前讀取時(shí)間和讀取秩序號(hào)。測(cè)試軟件的測(cè)試就是為了發(fā)現(xiàn)系統(tǒng)中的錯(cuò)誤,以及是否達(dá)到了需求說(shuō)明中所定義的需求。下面介紹對(duì)功能、以及的測(cè)試。功能測(cè)試基本同步功能測(cè)試:數(shù)據(jù)項(xiàng)如表8:表8:輸入數(shù)據(jù)NameDesAge“A”“描述A”10“AAB”“描述B”20“CC”“描述CC”30“DD”“描述DD”40操作:對(duì)表8的數(shù)據(jù)添加、修改、刪除到源端。輸出:數(shù)據(jù)實(shí)時(shí)的同步到目的端數(shù)據(jù)庫(kù)表。測(cè)試過(guò)程:?jiǎn)?dòng)托盤如圖8:圖8啟動(dòng)托盤修改配置信息如圖9:圖9配置信息通過(guò)托盤開(kāi)起同步服務(wù)。配置并開(kāi)啟目標(biāo)端如圖10:圖10目標(biāo)端源

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論