天天看點

如何做到在虛拟資料庫和真實資料庫之間自由切換?【低調贈送:QQ高仿版GG 4.4 最新源碼】

不需要任何部署,這是虛拟資料庫最友善的地方和最大的好處了!我們都知道,有時僅僅為了給客戶示範一個簡單的小功能,就需要安裝一個龐大的SqlServer或Oralce,是多麼痛苦的一件事!

      記得以前在公司上班時,有時候白天的活沒幹完,我就會把工作帶回家晚上加班繼續做。但是,我們開發用的資料庫是部署在公司局網内部的一台伺服器上的,在家裡是肯定連不上這台機器的。在家裡沒有資料庫,服務端就跑不起來,功能也就沒辦法調試。後來我們的解決方法就是使用虛拟資料庫。在公司上班時,就使用公司局網的真實資料庫;回到家,就使用記憶體中虛拟的資料庫,做一些基本的功能調試,絕對是足夠了。

      GG之前的版本一直隻支援虛拟資料庫,因為部署、示範都非常友善。後來有很多朋友要求增加對真實資料庫的支援,那麼這次GG的最新版本V4.4 就滿足了大家的這一需求,真實資料庫使用SqlServer(2000/2005/2008),并使用一個配置就可以在真實/虛拟資料庫之間自由切換。本文就将詳細介紹我們是如何實作在虛拟資料庫和真實資料庫之間自由切換這一功能的。

      想要直接下載下傳體驗的朋友請點選:“下載下傳中心”

一. 什麼是虛拟資料庫?

      剛baidu了一下,似乎沒有“虛拟資料庫”這個專業術語。那麼我就結合類似上面的使用場景,按照自己的了解來簡單解釋一下,虛拟資料庫有以下幾個要點:

(1)“虛拟”是和“真實”相對的。它不是一個真實的資料庫,而是一個資料庫的模拟。

(2)隻在軟體運作的過程中存在。比如,當服務端啟動時,會在記憶體中建構這個虛拟資料庫。

(3)隻存在于記憶體中,沒有持久化機制。比如,在服務端運作過程中,會對虛拟資料庫進行CRUD操作,但是當服務端重新開機後,這些修改就都會丢失,虛拟資料庫又會恢複到它的初始狀态。

(4)不需要任何部署。這是虛拟資料庫最友善的地方和最大的好處了。我們都知道有時僅僅為了給客戶示範一個簡單的小功能,就需要安裝一個龐大的SqlServer或Oralce,是多麼痛苦的一件事!

二. 虛拟資料庫如何實作?

      我們經常用Dictionary<,>模拟一個虛拟資料庫中的表,Dictionary的key就模拟表的主鍵,value就模拟一條記錄。比如,GG中的使用者表GGUser,在虛拟資料庫中就可以這樣模拟:

//模拟GGUser表
    private Dictionary<string, GGUser> userTable = new Dictionary<string, GGUser>(); 

    //模拟插入一個GGUser
    public void InsertUser(GGUser user)
    {
        lock (this.userTable)
        {
            this.userTable.Add(user.ID, user);
        }
    }      

      類似上面的代碼,我們可以很快地寫出與GGUser表相關的CRUD操作。同理,也可以模拟GGGroup(GG群)表、ChatMessageRecord(聊天記錄)表等等。

      我們把所有對虛拟表的操作全封裝在一個類VirtualDB中,于是,我們就可以程VirtualDB就是虛拟資料庫的抽象了。

      在VirtualDB的構造函數中,我們可以為虛拟表添加一些測試資料,這樣,服務端啟動後,就有一些基礎資料提供給調試、測試、或Demo示範使用了。

三. 如何實作在虛拟資料庫和真實資料庫之間切換?

1. 裡氏替換原則

    我們首先回憶一下,經典OO設計原則中的一個:裡氏替換原則。這個原則是這樣說的:所有引用基類的地方必須能夠透明地使用其子類的對象。 

      似乎有點拗口,下面就結合GG中的實作解釋一下:

(1)GG中用于表示虛拟資料庫的類是VirtualDB類,用于表示真實資料庫的類是RealDB類。

(2)VirtualDB類和RealDB類都從接口IDBPersister接口繼承。

(3)但是,GG服務端程式中凡是涉及到資料庫通路操作的地方,既不使用VirtualDB、也不使用RealDB,而是使用IDBPersister。

如何做到在虛拟資料庫和真實資料庫之間自由切換?【低調贈送:QQ高仿版GG 4.4 最新源碼】

       這樣,我們就隻需要在程式啟動的時候,指定将VirtualDB執行個體或RealDB執行個體指派給IDBPersister引用,就可以讓整個服務端統一地通路虛拟資料庫或是真實資料庫了。

       結合這個執行個體,我們把裡氏替換原則放到這個場景中,其意思就是:在程式中不要依賴具體的實作類(VirtualDB和RealDB),而是依賴于它們的共同接口(IDBPersister)。這樣,替換就很友善了。

2. 使用配置檔案

       如果打算将使用VirtualDB還是使用RealDB的決定權交給使用者,那麼隻需要在配置檔案中增加一個配置項即可。比如:       

<!--使用記憶體虛拟資料庫-->
    <add key="UseVirtualDB" value="false"/>
    <!--資料庫名稱-->
    <add key="DBName" value="GG2014"/>
    <!--資料庫IP-->
    <add key="DBIP" value="127.0.0.1"/>
    <!--資料庫sa的密碼-->
    <add key="SaPwd" value="123qwe"/>      

       上述的配置,還包含了資料庫的相關資訊。如果要使用虛拟的資料庫,隻需要将UseVirtualDB項配置為true即可。

       在服務端啟動的時候,讀取配置,然後決定是否使用虛拟資料庫。

IDBPersister persister;
    if (bool.Parse(ConfigurationManager.AppSettings["UseVirtualDB"]))
    {
        persister = new VirtualDB();
    }
    else
    {
        persister = new RealDB( ConfigurationManager.AppSettings["DBName"] ,ConfigurationManager.AppSettings["DBIP"], ConfigurationManager.AppSettings["SaPwd"]);
    }

    GlobalCache globalCache = new GlobalCache(persister);      

四.GG V4.4 源碼 

   下載下傳最新版本,請轉到這裡。 

       GG是可在廣域網部署運作的QQ高仿版,2013.8.7釋出V1.0版本,至今最新是4.4版本,關于GG更詳細的介紹,可以檢視 可在廣域網部署運作的QQ高仿版 -- GG2014總覽。

   在GG的最新版本中使用了上述方案以支援在真實資料庫和虛拟資料庫之間互相切換。     

________________________________________________________________________ 

歡迎和我探讨關于 GG 和 GGMeeting 的一切,我的QQ:2027224508,多多交流!  

大家有什麼問題和建議,可以留言,也可以發送email到我郵箱:[email protected]。  

如果你覺得還不錯,請粉我,順便再頂一下啊 

繼續閱讀