1. 程式人生 > >設計模式綜合例項分析之資料庫同步系統(一)

設計模式綜合例項分析之資料庫同步系統(一)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

        最近有很多朋友跟我聊到關於“在軟體專案開發中如何合理使用設計模式”的問題,希望我能夠給出一些相對比較完整的真實專案例項,為了滿足大家的要求,在後續文章中,我將拿出幾個較為複雜的例項與大家一起分享,有些專案是我參與開發的,有些專案是在我的指導下開發的,希望能給大家帶來幫助!微笑

在此我也希望大家能夠分享自己的一些設計模式使用心得和好的設計模式應用例項,可以整理一份給我(可傳送到郵箱:[email protected]),在下一本設計模式圖書(有計劃明年寫一本《設計模式案例剖析》,暫定名)中我將選取部分例項加入其中,如有入選者,Sunny承諾送簽名圖書兩本,偷笑選擇範圍包括已經出版的《設計模式》《設計模式實訓教程》《設計模式的藝術》,還包括馬上要出版的《C#設計模式》和正在編寫的《UML建模實訓教程》,任君挑選,正版保證,假一罰十!大笑

 

        從本文開始,我將介紹一個資料庫同步系統

的設計方案,該系統是我在2010年給某軟體公司做設計模式內訓時指導幾位開發人員所開發的一個專案,系統以某省級移動公司應急管理系統資料備份(資料庫同步)需求為原型,基本需求如下:

        為了在資料庫發生故障的情況下不影響核心業務的執行,需要將生產資料庫定期備份到應急資料庫,以備生產資料庫發生故障時,能切換到應急資料庫,保證業務的正常執行。由於移動公司的資料量非常大,所以只需要對基礎資料和關鍵資料進行備份,為了確保切換到應急資料庫時保證核心業務能夠執行,還需要備份整個資料庫結構。

      系統目前需求僅要求支援Oracle

資料庫的同步,但系統設計時需要考慮以後可以方便地支援其他資料庫。Oracle資料庫的結構由各種資料庫物件組成,要求完成對各種資料庫物件的同步,包括表(包括約束)、索引、觸發器、分割槽表、檢視、儲存過程、函式、包、資料庫連線、序列、物化檢視和同義詞。各類資料庫物件的同步有一定的順序關係,總體流程如圖1所示:

1 資料庫同步流程圖

 

       資料庫同步系統介面如圖2所示:

圖2 資料庫同步系統介面

       使用者在操作介面指定源資料庫、目標資料庫、控制資料庫(用於讀取配置資訊)的資料庫連線串,同時選取需要同步的資料庫物件型別,物件型別儲存在配置檔案database_syn_config.xml中,通過輸入SQL語句可以獲取需要同步的表資料。

       資料庫物件同步的處理邏輯描述如下:

       (1) 對於一般的資料庫物件,同步時先取出源資料庫與目標資料庫該類資料庫物件進行對比,然後將物件更新到目標資料庫。

       (2) 對於DBLink物件,由於資料庫環境發生變化,需要手工調整,同步過程只記錄新增的DBLink資訊,而不執行建立操作。

       (3) 表的同步處理由於其包含資料,因此較為特殊,需先對錶結構變化進行分析,再同步資料。表資料的同步有三種方式:增量同步、先DeleteInsert方式、臨時表方式。

       (I) 增量同步。適用於可確定最後修改時間戳欄位的情況。

       (II) DeleteInsert方式。即先刪除表的資料,再將源資料庫的該表資料插入到目標資料庫,為確保資料安全,要求在一個事務內完成。

       (III) 臨時表方式。用於最大限度保證資料的完整性,是一種在發生意外情況時,不丟失資料而使用的較為複雜的方式。

       由於對資料庫結構修改無法做事務回滾,因此如果後面的步驟發生異常,需要通過手工編碼方式來實現目標資料庫結構變化的回滾。

       在本系統實現過程中使用了多種設計模式,下面對其進行簡要分析(為了簡化程式碼和類圖,省略了關於包的描述,在實際應用中已將不同的類封裝在不同包中):

 

         1. 建造者模式

       在本系統實現時提供了一個數據庫同步流程管理器DBSynchronizeManager類,它用於負責控制資料庫同步的具體執行步驟。使用者在前臺介面可以配置同步引數,程式執行時,需要根據這些引數來建立DBSynchronizeManager物件,建立完整DBSynchronizeManager物件的過程由類DBSynchronizeManagerBuilder負責,此時可以使用建造者模式來一步一步構造一個完整的複雜物件,類圖如圖3所示:

圖3 建造者模式例項類圖

       在圖3中省略了抽象建造者,DBSynchronizeManagerDirector充當指揮者類,DBSynchronizeManagerBuilder充當建造者,DBSynchronizeManager充當複雜產品。

 

      2. 簡單工廠模式

       DBSynchronizeManagerBuilder類的buildLife()方法可以建立一個初始的DBSynchronizeManager例項,再一步一步為其設定屬性,為了保證在更換資料庫時無須修改DBSynchronizeManagerBuilder類的原始碼,在此處使用簡單工廠模式進行設計,將資料庫型別儲存在配置檔案中,如下片段程式碼所示:

……<dbSynchronizeManager dbType="oracle" class="com. chinacreator.dbSyn.oracle.OracleDB SynchronizeManager"/> ……

       類圖如圖4所示:

圖4 簡單工廠模式例項類圖

       使用簡單工廠模式設計的工廠類DBSynchronizeManagerFactory程式碼如下所示:

public class DBSynchronizeManagerFactory {  public static DBSynchronizeManager factory(String dbType) throws Exception {  String className = DBSynConfigParser.getSynchronizeManagerClass(dbType);  return (DBSynchronizeManager)Class.forName(className).newInstance(); }}

       其中DBSynConfigParser類用於讀取配置檔案,在圖4中,DBSynchronizeManagerFactory類充當資料庫同步流程管理器的簡單工廠,DBSynchronizeManager是抽象產品,而OracleDBSynchronizeManager為具體產品。

 

【作者:劉偉   http://blog.csdn.net/lovelion 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述