如何作到在虛擬數據庫和真實數據庫之間自由切換?【低調贈送:QQ高仿版GG 4.4 最新源碼】 可在廣域網部署運行的QQ高仿版 -- GG2014總覽

      記得之前在公司上班時,有時候白天的活沒幹完,我就會把工做帶回家晚上加班繼續作。可是,咱們開發用的數據庫是部署在公司局網內部的一臺服務器上的,在家裏是確定連不上這臺機器的。在家裏沒有數據庫,服務端就跑不起來,功能也就沒辦法調試。後來咱們的解決方法就是使用虛擬數據庫。在公司上班時,就使用公司局網的真實數據庫;回到家,就使用內存中虛擬的數據庫,作一些基本的功能調試,絕對是足夠了。html

      GG以前的版本一直只支持虛擬數據庫,由於部署、演示都很是方便。後來有不少朋友要求增長對真實數據庫的支持,那麼此次GG的最新版本V4.4 就知足了你們的這一需求,真實數據庫使用SqlServer(2000/2005/2008),並使用一個配置就能夠在真實/虛擬數據庫之間自由切換。本文就將詳細介紹咱們是如何實如今虛擬數據庫和真實數據庫之間自由切換這一功能的。數據庫

      想要直接下載體驗的朋友請點擊:「下載中心」服務器

一. 什麼是虛擬數據庫?

      剛baidu了一下,彷佛沒有「虛擬數據庫」這個專業術語。那麼我就結合相似上面的使用場景,按照本身的理解來簡單解釋一下,虛擬數據庫有如下幾個要點:函數

(1)「虛擬」是和「真實」相對的。它不是一個真實的數據庫,而是一個數據庫的模擬。post

(2)只在軟件運行的過程當中存在。好比,當服務端啓動時,會在內存中構建這個虛擬數據庫。測試

(3)只存在於內存中,沒有持久化機制。好比,在服務端運行過程當中,會對虛擬數據庫進行CRUD操做,可是當服務端重啓後,這些修改就都會丟失,虛擬數據庫又會恢復到它的初始狀態。this

(4)不須要任何部署。這是虛擬數據庫最方便的地方和最大的好處了。咱們都知道有時僅僅爲了給客戶演示一個簡單的小功能,就須要安裝一個龐大的SqlServer或Oralce,是多麼痛苦的一件事!url

二. 虛擬數據庫如何實現?

      咱們常常用Dictionary<,>模擬一個虛擬數據庫中的表,Dictionary的key就模擬表的主鍵,value就模擬一條記錄。好比,GG中的用戶表GGUser,在虛擬數據庫中就能夠這樣模擬:spa

    //模擬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。

        

       這樣,咱們就只須要在程序啓動的時候,指定將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到我郵箱:2027224508@qq.com。  

若是你以爲還不錯,請粉我,順便再頂一下啊 

相關文章
相關標籤/搜索