數(shù)據(jù)結(jié)轉(zhuǎn)的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別地涉及一種數(shù)據(jù)結(jié)轉(zhuǎn)的方法和裝置。
【背景技術(shù)】
[0002]隨著計(jì)算機(jī)應(yīng)用系統(tǒng)的不斷發(fā)展,數(shù)據(jù)庫(kù)中的數(shù)據(jù)量也在持續(xù)增長(zhǎng),于是數(shù)據(jù)結(jié)轉(zhuǎn)方案成為降低數(shù)據(jù)庫(kù)壓力的重要手段。數(shù)據(jù)結(jié)轉(zhuǎn)主要是指將一個(gè)數(shù)據(jù)庫(kù)中的部分或全部數(shù)據(jù)轉(zhuǎn)移到另一個(gè)數(shù)據(jù)庫(kù)中。
[0003]目前的一些文件系統(tǒng)提供了數(shù)據(jù)結(jié)轉(zhuǎn)的方案,例如利用Hadoop+sqoop可以實(shí)現(xiàn)Hadoop分布式文件系統(tǒng)(hdfs)與關(guān)系型數(shù)據(jù)庫(kù)之間的數(shù)據(jù)傳輸,從而借助hfds可以實(shí)現(xiàn)關(guān)系型數(shù)據(jù)庫(kù)之間的數(shù)據(jù)轉(zhuǎn)移。具體而言,首先,利用sqoop將數(shù)據(jù)從關(guān)系型數(shù)據(jù)庫(kù)(比如SQLServer數(shù)據(jù)庫(kù))中結(jié)轉(zhuǎn)到hfds中,然后再反向?qū)dfs中數(shù)據(jù)結(jié)轉(zhuǎn)到另一個(gè)關(guān)系型數(shù)據(jù)庫(kù)之中(比如另外一個(gè)SQLServer數(shù)據(jù)庫(kù))。
[0004]利用目前的文件系統(tǒng)提供的數(shù)據(jù)結(jié)轉(zhuǎn)方案,可以達(dá)到很大的數(shù)據(jù)吞吐量,即每個(gè)批次轉(zhuǎn)移的數(shù)據(jù)量非常大,并且系統(tǒng)能夠水平擴(kuò)展,也可以跨數(shù)據(jù)庫(kù)轉(zhuǎn)移。但其缺點(diǎn)主要是難以保證每一條數(shù)據(jù)的結(jié)轉(zhuǎn)正確性。
【發(fā)明內(nèi)容】
[0005]有鑒于此,本發(fā)明提供一種數(shù)據(jù)結(jié)轉(zhuǎn)的方法和裝置,有助于提高數(shù)據(jù)結(jié)轉(zhuǎn)的正確性。本發(fā)明的其他目的和效果可以從【具體實(shí)施方式】中得出。
[0006]為實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的一個(gè)方面,提供了一種數(shù)據(jù)結(jié)轉(zhuǎn)的方法。
[0007]本發(fā)明的數(shù)據(jù)結(jié)轉(zhuǎn)的方法包括:判斷中間表中是否存在數(shù)據(jù),若是,將中間表中的數(shù)據(jù)主鍵在源表中對(duì)應(yīng)的數(shù)據(jù)作為待結(jié)轉(zhuǎn)數(shù)據(jù);否則將源表中的預(yù)先選取的數(shù)據(jù)的主鍵保存到中間表,并將所述預(yù)先選取的數(shù)據(jù)作為待結(jié)轉(zhuǎn)數(shù)據(jù);將所述待結(jié)轉(zhuǎn)數(shù)據(jù)分片,然后開啟線程池中的多個(gè)線程;所述多個(gè)線程各自根據(jù)中間表中的數(shù)據(jù)主鍵從源表中互不重復(fù)地獲取該數(shù)據(jù)主鍵對(duì)應(yīng)的數(shù)據(jù),然后將獲取的數(shù)據(jù)結(jié)轉(zhuǎn)至目標(biāo)表;在所述多個(gè)線程將獲取的數(shù)據(jù)結(jié)轉(zhuǎn)至目標(biāo)表之后,判斷所述待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后是否一致然后輸出判斷結(jié)果。
[0008]可選地,所述判斷所述待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后是否一致的步驟包括:分別計(jì)算源表中的待結(jié)轉(zhuǎn)數(shù)據(jù)和結(jié)轉(zhuǎn)至目標(biāo)表中的數(shù)據(jù)的二進(jìn)制校驗(yàn)值,從而分別得到源散列表和目標(biāo)散列表;根據(jù)所述源散列表和目標(biāo)散列表是否一致,確定所述待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后是否一致。
[0009]可選地,所述源表和目標(biāo)表是SQLServer數(shù)據(jù)庫(kù)中的數(shù)據(jù)表;所述計(jì)算源表中的待結(jié)轉(zhuǎn)數(shù)據(jù)和結(jié)轉(zhuǎn)至目標(biāo)表中的數(shù)據(jù)的二進(jìn)制校驗(yàn)值的步驟包括:使用binary_checksum函數(shù)得到源表中的待結(jié)轉(zhuǎn)數(shù)據(jù)和結(jié)轉(zhuǎn)至目標(biāo)表中的數(shù)據(jù)的二進(jìn)制校驗(yàn)值。
[0010]可選地,根據(jù)所述源散列表和目標(biāo)散列表是否一致,確定所述待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后是否一致的步驟包括:以目標(biāo)散列表為參照,采用JAVA語句removeall對(duì)源散列表進(jìn)行操作;在所述操作完成后,判斷若源散列表中無剩余數(shù)據(jù),則確定所述待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后一致,否則為不一致。
[0011]可選地,在所述輸出判斷結(jié)果的步驟之后,還包括:若所述判斷結(jié)果為一致,則刪除中間表中的數(shù)據(jù)以及源表中的數(shù)據(jù);若所述判斷結(jié)果為不一致,則輸出提示信息。
[0012]根據(jù)本發(fā)明的另一方面,提供了一種數(shù)據(jù)結(jié)轉(zhuǎn)的裝置。
[0013]本發(fā)明的數(shù)據(jù)結(jié)轉(zhuǎn)的裝置包括:判斷模塊,用于判斷中間表中是否存在數(shù)據(jù);主鍵保存模塊,用于在中間表不存在數(shù)據(jù)的情況下,將源表中的預(yù)先選取的數(shù)據(jù)的主鍵保存到中間表;分片模塊,用于在中間表存在數(shù)據(jù)的情況下,將中間表中的數(shù)據(jù)主鍵在源表中對(duì)應(yīng)的數(shù)據(jù)進(jìn)行分片,以及在中間表不存在數(shù)據(jù)的情況下,將源表中的預(yù)先選取的數(shù)據(jù)分片;線程池模塊,用于管理線程池中的多個(gè)線程,其中所述多個(gè)線程各自根據(jù)中間表中的數(shù)據(jù)的主鍵從源表中互不重復(fù)地獲取該數(shù)據(jù)主鍵對(duì)應(yīng)的數(shù)據(jù),然后將獲取的數(shù)據(jù)結(jié)轉(zhuǎn)至目標(biāo)表;校驗(yàn)?zāi)K,用于在所述多個(gè)線程將獲取的數(shù)據(jù)結(jié)轉(zhuǎn)至目標(biāo)表之后,判斷所述待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后是否一致然后輸出判斷結(jié)果。
[0014]可選地,所述校驗(yàn)?zāi)K還用于:分別計(jì)算源表中的待結(jié)轉(zhuǎn)數(shù)據(jù)和結(jié)轉(zhuǎn)至目標(biāo)表中的數(shù)據(jù)的二進(jìn)制校驗(yàn)值,從而分別得到源散列表和目標(biāo)散列表;根據(jù)所述源散列表和目標(biāo)散列表是否一致,確定所述待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后是否一致。
[0015]可選地,所述源表和目標(biāo)表是SQLServer數(shù)據(jù)庫(kù)中的數(shù)據(jù)表;所述校驗(yàn)?zāi)K還用于使用binary_checksum函數(shù)得到源表中的待結(jié)轉(zhuǎn)數(shù)據(jù)和結(jié)轉(zhuǎn)至目標(biāo)表中的數(shù)據(jù)的二進(jìn)制校驗(yàn)值。
[0016]可選地,所述校驗(yàn)?zāi)K還用于:以目標(biāo)散列表為參照,采用JAVA語句removealI對(duì)源散列表進(jìn)行操作;在所述操作完成后,判斷若源散列表中無剩余數(shù)據(jù),則確定所述待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后一致,否則為不一致。
[0017]可選地,還包括刪除模塊和提示模塊,其中:刪除模塊用于在所述比較結(jié)果為一致的情況下,刪除中間表中的數(shù)據(jù)以及源表中的數(shù)據(jù);提示模塊用于在所述比較結(jié)果為不一致的情況下,輸出提示信息。
[0018]根據(jù)本發(fā)明的技術(shù)方案,采用了多線程機(jī)制,有助于保證數(shù)據(jù)結(jié)轉(zhuǎn)效率;在此基礎(chǔ)上對(duì)于數(shù)據(jù)結(jié)轉(zhuǎn)前后是否一致進(jìn)行校驗(yàn),保證結(jié)轉(zhuǎn)前后數(shù)據(jù)的正確性;另外采用中間表保存數(shù)據(jù)主鍵,有助于保證數(shù)據(jù)處理時(shí)不丟失處理以及不重復(fù)處理。
【附圖說明】
[0019]附圖用于更好地理解本發(fā)明,不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。其中:
[0020]圖1是根據(jù)本發(fā)明實(shí)施方式的數(shù)據(jù)結(jié)轉(zhuǎn)的方法的主要步驟的示意圖;
[0021]圖2是根據(jù)本發(fā)明實(shí)施方式的數(shù)據(jù)結(jié)轉(zhuǎn)的裝置的基本組成部分的示意圖。
【具體實(shí)施方式】
[0022]以下結(jié)合附圖對(duì)本發(fā)明的示范性實(shí)施方式做出說明,其中包括本發(fā)明實(shí)施方式的各種細(xì)節(jié)以助于理解,應(yīng)當(dāng)將它們認(rèn)為僅僅是示范性的。因此,本領(lǐng)域普通技術(shù)人員應(yīng)當(dāng)認(rèn)識(shí)到,可以對(duì)這里描述的實(shí)施方式做出各種改變和修改,而不會(huì)背離本發(fā)明的范圍和精神。同樣,為了清楚和簡(jiǎn)明,以下的描述中省略了對(duì)公知功能和結(jié)構(gòu)的描述。
[0023]在本發(fā)明實(shí)施方式中,將數(shù)據(jù)從源表轉(zhuǎn)存到目標(biāo)表,該數(shù)據(jù)可以根據(jù)配置來選取源表中的全部或部分。由中間表保存要結(jié)轉(zhuǎn)的數(shù)據(jù)的主鍵,然后按中間表中的數(shù)據(jù)主鍵從源表查詢數(shù)據(jù)再將該數(shù)據(jù)結(jié)轉(zhuǎn)至目標(biāo)表。具體可以按圖1所示的流程執(zhí)行,圖1是根據(jù)本發(fā)明實(shí)施方式的數(shù)據(jù)結(jié)轉(zhuǎn)的方法的主要步驟的示意圖。該流程可采用單獨(dú)開發(fā)的程序組件來完成。
[0024]步驟Sll:加載配置文件信息。配置文件中配置了例如源表和目標(biāo)表分別所在的源數(shù)據(jù)庫(kù)信息和目標(biāo)數(shù)據(jù)庫(kù)信息、登錄源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)需要的用戶名和密碼、以及要結(jié)轉(zhuǎn)哪些數(shù)據(jù)等。
[0025]步驟S12:判斷中間表中是否存在數(shù)據(jù)。此數(shù)據(jù)可能是因?yàn)樯洗谓Y(jié)轉(zhuǎn)校驗(yàn)失敗,斷電以及在數(shù)據(jù)結(jié)轉(zhuǎn)中遇到各種異常情況導(dǎo)致。若存在數(shù)據(jù),在此先將殘留數(shù)據(jù)結(jié)轉(zhuǎn)完成,因此直接進(jìn)入步驟S14,否則進(jìn)入步驟S13。
[0026]步驟S13:將源表中的要結(jié)轉(zhuǎn)的數(shù)據(jù)的主鍵放入中間表。數(shù)據(jù)的主鍵是數(shù)據(jù)的唯一標(biāo)識(shí)O
[0027]步驟S14:將數(shù)據(jù)分片,然后開啟多個(gè)線程。此時(shí)可以先計(jì)算要結(jié)轉(zhuǎn)的數(shù)據(jù)總量,然后確定每片的大小。這里的多個(gè)線程可以采用線程池統(tǒng)一管理,使各線程處理的數(shù)據(jù)片互不重復(fù)。
[0028]步驟S15:每個(gè)線程對(duì)數(shù)據(jù)進(jìn)行結(jié)轉(zhuǎn)。在本步驟中,每個(gè)線程從中間表取出自己要處理的數(shù)據(jù)的主鍵,從源表中查詢?cè)撝麈I對(duì)應(yīng)的數(shù)據(jù),再將該數(shù)據(jù)結(jié)轉(zhuǎn)至目標(biāo)表。結(jié)轉(zhuǎn)完成后,可以在中間表中添加標(biāo)識(shí)以標(biāo)明該主鍵對(duì)應(yīng)的數(shù)據(jù)已經(jīng)結(jié)轉(zhuǎn)完成。在所有線程對(duì)自己要結(jié)轉(zhuǎn)的數(shù)據(jù)完成結(jié)轉(zhuǎn)后,進(jìn)入步驟S16。
[0029]步驟S16:判斷待結(jié)轉(zhuǎn)數(shù)據(jù)在結(jié)轉(zhuǎn)前后是否一致。此步驟是對(duì)結(jié)轉(zhuǎn)前后的數(shù)據(jù)是否一致進(jìn)行校驗(yàn)。源表中有結(jié)轉(zhuǎn)前的數(shù)據(jù),目標(biāo)表中包含結(jié)轉(zhuǎn)后的數(shù)據(jù),比較相同主鍵的結(jié)轉(zhuǎn)前的數(shù)