天天看點

大資料高效複制的處理案例分析總結

一個老客戶提出這樣的需求,希望将SQLServer中的某個表的資料快速複制到SQLite資料庫裡面以便進行定期的備份處理,資料表的記錄大概有50多萬條記錄,表有100個字段左右,除了希望能夠快速做好外,效率是第一位的,他自己測試總是在一兩個小時的時間以上。客戶提出這樣的需求,我我覺得肯定是沒有很好的利用事務的特性,否則速度應該會快得多,但是具體能快到什麼程度,心裡也不太确定。于是按照這個要求,把這樣大的表資料複制作為一個案例來進行研究,最終大資料的複制處理,不到20分鐘就可以完成全部資料的複制更新處理。本文主要介紹這個需求如何結合實際開發的需要進行處理,達到快速高效的複制資料的目的,并提供相關的實作思路和代碼供參考學習。

由于客戶是需要做定期的資料備份,是以這樣的複制是進行的,是以大資料的複制效率肯定是很重要的,應該盡可能的短時間完成。資料表的記錄大概有50多萬條記錄,表有100個字段左右的需要也是比正常的表資料會多一些,是以需要做好很好的測試,我們根據這樣的需求背景,使用一個測試案例來對性能進行測試。

大資料高效複制的處理案例分析總結

這樣多字段的表,資料字段的一一對應,手工肯定是很累的,是以我們使用代碼生成工具Database2Sharp來進行快速開發,這樣底層的處理我們就可以不用太過關注,而且可以為不同的資料處理,生成不同的資料通路層即可。

在底層我們主要是采用了微軟的Enterprise Library的資料庫通路子產品,是以它能夠很好抽象各種資料庫的事務,以适應各種不同資料庫的事務處理。使用微軟的Enterprise Library子產品,可以很好支援SQLSever、Oracle、Mysql、Access、SQLite等資料庫。

開發架構,常見的分層模式,可以分為UI層、BLL層、DAL層、IDAL層、Entity層、公用類庫層等等

大資料高效複制的處理案例分析總結

架構的基類我們封裝了大量的通用性處理函數,包括資料通路層、業務邏輯層的基類,所有的基類函數基本上都帶有一個DbTransaction trans = null 的定義,就是我們可以采用事務,也可以預設不采用事務,是一個可選性的事務參數。

如資料通路接口和基于SQLServer的資料通路類的實作圖示如下所示。

大資料高效複制的處理案例分析總結

在最進階的抽象基類AbstractBaseDAL的資料通路層裡面,都有大量關于資料操作和相關事務的接口可以使用,是以我們在底層繼承的子類,如果我們處理資料的增删改查等操作,基本上就不需要做任何擴充性代碼了,這樣很符合我們快速開發的目的。

上面講到,開發這樣的資料複制處理程式,這樣多字段的表,資料字段的一一對應,手工肯定是很累的,是以我們使用代碼生成工具Database2Sharp來進行快速開發。

是以使用代碼生成工具來快速生成所需要的代碼,展開資料庫後,從資料庫節點上,右鍵選擇【代碼生成】【Enterprise Library代碼生成】就可以生成标準的界面層一下的代碼了,由于我們整個案例是非标準的資料複制處理,界面部分不需要利用代碼生成工具進行Winform界面的生成的。

大資料高效複制的處理案例分析總結

生成代碼的一步步操作,最後确認一下就可以生成相關的底層代碼了

大資料高效複制的處理案例分析總結

最後我們生成這樣的BLL、DAL、IDAL、Entity幾個層的項目代碼,整個項目的代碼各種繼承關系已經處理好了,也就具有了基類擁有的增删改查等基礎操作了。

大資料高效複制的處理案例分析總結

我們做兩個不同資料庫的複制處理操作,關鍵還是要生成兩個不同資料庫通路類的代碼(也就是生成一個标準的SQLServer後,複制一份代碼,修改下繼承基類即可實作),如下代碼是兩個資料通路類的代碼,不用增加任何接口即可滿足目前項目的需要的了。

大資料高效複制的處理案例分析總結
大資料高效複制的處理案例分析總結

最終我們的項目結構如下所示。

大資料高效複制的處理案例分析總結

為了友善整個複制過程的進度展示(很重要),我們設計了進度條以及文字内容,展示處理過程的進度和耗時等資訊,最終界面設計如下所示。

大資料高效複制的處理案例分析總結

整個界面設計利用背景線程的方式對資料複制進行處理,友善及時在界面顯示進度而不阻塞界面線程。

具體的界面代碼如下所示。

在上面的窗體界面代碼裡面,最為關鍵的代碼就是具體背景程序的處理邏輯,如下代碼所示。

上面的處理邏輯為了友善,把資料的複制内容放到了一個輔助類裡面,并在輔助類的Start方法裡面傳入了界面通知的Action處理函數,這樣我們在CopyDataUtil 處理的時候就可以随時進行消息的通知了。

資料複制的Start方法定義如下所示。

整個輔助類CopyDataUtil 類裡面定義了兩個不同資料庫類型的對象,友善資料庫的指派處理操作,并且定義了開始時間,結束時間,這樣可以統計總共的耗時資訊,如下代碼所示。

整個複制資料的邏輯,主要就是基于事務性的處理,按照分頁規則,每次按照一定的數量,批量從SQLServer裡面取出資料,然後插入SQLite資料庫裡面,使用事務可以是的SQLite的資料寫入非常高效快速,具體代碼如下所示。

至此,整個項目的代碼就基本上介紹完畢了,測試整個複制過程,單表50多萬的資料,100個字段左右,在開發機器上20分鐘不到就複制完成,确實是很不錯的成績了,如果修改為伺服器的環境專門做複制處理,肯定速度還會提高不少。

大資料高效複制的處理案例分析總結