設計模式綜合例項分析之資料庫同步系統(一)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
最近有很多朋友跟我聊到關於“在軟體專案開發中如何合理使用設計模式”的問題,希望我能夠給出一些相對比較完整的真實專案例項,為了滿足大家的要求,在後續文章中,我將拿出幾個較為複雜的例項與大家一起分享,有些專案是我參與開發的,有些專案是在我的指導下開發的,希望能給大家帶來幫助!
從本文開始,我將介紹一個資料庫同步系統
為了在資料庫發生故障的情況下不影響核心業務的執行,需要將生產資料庫定期備份到應急資料庫,以備生產資料庫發生故障時,能切換到應急資料庫,保證業務的正常執行。由於移動公司的資料量非常大,所以只需要對基礎資料和關鍵資料進行備份,為了確保切換到應急資料庫時保證核心業務能夠執行,還需要備份整個資料庫結構。
系統目前需求僅要求支援Oracle
圖1 資料庫同步流程圖
資料庫同步系統介面如圖2所示:
圖2 資料庫同步系統介面
使用者在操作介面指定源資料庫、目標資料庫、控制資料庫(用於讀取配置資訊)的資料庫連線串,同時選取需要同步的資料庫物件型別,物件型別儲存在配置檔案database_syn_config.xml中,通過輸入SQL語句可以獲取需要同步的表資料。
資料庫物件同步的處理邏輯描述如下:
(1) 對於一般的資料庫物件,同步時先取出源資料庫與目標資料庫該類資料庫物件進行對比,然後將物件更新到目標資料庫。
(2) 對於DBLink物件,由於資料庫環境發生變化,需要手工調整,同步過程只記錄新增的DBLink資訊,而不執行建立操作。
(3) 表的同步處理由於其包含資料,因此較為特殊,需先對錶結構變化進行分析,再同步資料。表資料的同步有三種方式:增量同步、先Delete後Insert方式、臨時表方式。
(I) 增量同步。適用於可確定最後修改時間戳欄位的情況。
(II) 先Delete後Insert方式。即先刪除表的資料,再將源資料庫的該表資料插入到目標資料庫,為確保資料安全,要求在一個事務內完成。
(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】