1. 程式人生 > >如何做到在虛擬資料庫和真實資料庫之間自由切換?【低調贈送:QQ高仿版GG 4.4 最新原始碼】

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

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

      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。

        

       這樣,我們就只需要在程式啟動的時候,指定將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更詳細的介紹,可以檢視 。

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

________________________________________________________________________ 

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

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

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

相關推薦

如何做到在虛擬資料庫真實資料庫之間自由切換低調贈送QQ仿GG 4.4 最新原始碼

      記得以前在公司上班時,有時候白天的活沒幹完,我就會把工作帶回家晚上加班繼續做。但是,我們開發用的資料庫是部署在公司局網內部的一臺伺服器上的,在家裡是肯定連不上這臺機器的。在家裡沒有資料庫,服務端就跑不起來,功能也就沒辦法除錯。後來我們的解決方法就是使用虛擬資料庫。在公司上班時,就使用公司局網的真實

在現實世界的虛擬化虛擬世界的現實化之間自由切換

如果你堅持看完了前面兩篇文章,真的理解了什麼是設計,設計怎麼去做,那麼今天屬於一個進階教程。        一直以來,我一直在思考尋找設計的用途。為什麼這麼說呢?我一直覺得,只有找到設計的用途,才算是真正明白設計的重要性。就像一個剛入門的程式設計師,你去給他講設計,那是對牛

MyBatisPlus 如何忽略資料庫實體類之間的對映欄位

引用處: https://www.cnblogs.com/jym-sunshine/p/9540428.html mybatis-plus使用物件屬性進行SQL操作,經常會出現物件屬性非表字段的情況,忽略對映欄位時可以在實體類屬性上使用以下註解: @TableField(exist&nb

VirtualBox 虛擬機器宿主機之間的網路連線,虛擬機器主機都可以上網

本篇目的:實現了宿主機與虛擬機器,虛擬機器與虛擬機器互通,宿主機可上網,虛擬機器可上網 第一步:VirtualBox安裝centos7      第一步比較簡單,本篇就不多贅述,本篇重點在於對虛擬機器網路進行配置,下圖是安裝好的centos:

Mysql建立資料庫檢視資料庫

1.create database  ;(建立資料庫) create database mydb1 =(自定義)       [DEFAULT] CHARACTER SET charset_name  -- CHARACTER SET:

SELECT INTO INSERT INTO SELECT 兩種表複製語句詳解(SQL資料庫Oracle資料庫的區別)

https://www.cnblogs.com/mq0036/p/4155136.html 我們經常會遇到需要表複製的情況,如將一個table1的資料的部分欄位複製到table2中,或者將整個table1複製到table2中,這時候我們就要使用SELECT INTO 和 INSER

用EF的三種方式(SqlServer資料庫Oracle資料庫

SqlServer資料庫 1.DB First 現有DB,生成edmx檔案 貼一下生成的model //------------------------------------------------------------------------------ // <auto-generated&g

Robot Framework操作MySQL資料庫Oracle資料庫

一、Robot Framework連線MySQL資料庫 1.安裝databaselibrary、pymsql   通過cmd命令執行pip install robotframework-databaselibrary==1.1.1,安裝指定版本   通過cmd命令執行pip install&n

Oracle 10g DataGuard 監視主資料庫備用資料庫(官方文件)

-- 監視主資料庫和備用資料庫 --- -- 動態效能檢視(固定檢視)--- -- 監控流程活動 SELECT PROCESS, CLIENT_PROCESS, SEQUENCE#, STATUS FROM V$MANAGED_STANDBY; -- 確定重做申請的進度

CentOS下VMware-Tools安裝(CentOS虛擬機器本機之間進行拖拽,複製,貼上)

1.點選VMware Workstation 選單欄下的安裝VMware Tools 2.CentOS虛擬機器裡會彈出VMware Tools資料夾 3.把VMwareTools-10.0.10-4301679.tar.gz拖到桌面並解壓(解壓後文件名叫vmware-tools-di

利用python把pandas的DataFrame格式寫入資料庫讀出資料庫資料

DataFrame <--> sql 嘗試了各種把Excel,csv格式匯入資料庫,卻總是出現各種各樣的額錯誤,後來發現python的pymasql庫不支援 "pd.io.sql.to_sql(data, "file_name", con=engine, index=False,

VMware虛擬機器中如何安裝VMware Tools增強工具,以解決VMware虛擬機器本地系統之間複製貼上問題

1.操作環境: window10(本機系統) VMware虛擬機器 2.遇到問題         在windows系統上安裝VMware虛擬機器,然後就可以在虛擬機器上面模擬一些我們想要的執行環境,但是在使用的過程中會發現,windows系統上的文字不能夠複製貼上到V

java 使用jdbc連線Greenplum資料庫Postgresql資料庫

1 public class JdbcUtils { 2 3 // 1、Postgresql 4 private static String postgresql_driver; 5 private static String postgresql_url;

Oracle VirtualBox 虛擬機器宿主機之間的網路連線

問題:本機太老cpu不支援虛擬化不能用vmware,選擇了virtualbox環境:宿主機是window7 64位  虛擬機器centos minimal的安裝  Oracle VirtualBox-5

登陸ORACLE資料庫資料庫的一些簡單操作

在安裝好了ORACLE資料庫後,想要對資料庫進行操作,就必須首先登入到ORACLE資料庫,要登入到資料庫中,首先確認我們要登陸的賬戶是哪個,剛才安裝資料庫時, 我們解鎖了SCOTT, SYS, SYSTEM三個賬戶。 所以,我們先登入這幾個賬戶試試: 登陸資料庫各個賬

mysql資料庫oracle資料庫建立索引的原則

資料庫建立索引的原則  1,確定針對該表的操作是大量的查詢操作還是大量的增刪改操作。  2,嘗試建立索引來幫助特定的查詢。檢查自己的sql語句,為那些頻繁在where子句中出現的欄位建立索引。  3,嘗試建立複合索引來進一步提高系統性能。修改複合索引將消耗更長時間,同時,複合

將檔案上傳到資料庫 資料庫下載檔案到本地

有時候我們需要把圖片、文件、dll檔案、等等,上傳的資料庫,然後當需要的時候再從資料庫中讀取到本地,下面我以上傳圖片為例,講解一下如何把本地的一張圖片上傳到資料庫,然後再從資料庫下載到本地。   工具:VS2010,Sql Server 2000。語言:C#。   像

本地資料庫伺服器資料庫同步問題

本地資料庫表的資料改變時伺服器資料庫對應的表也同時也改變但是本地的聯網狀態不能確定時間,聯網時候 就把本地改變過的資料 新增到伺服器資料庫中。請問 大蝦們有什麼好的方法啊!最好有程式碼··我目前就 是用的 XML檔案 讀取資料 然後傳到伺服器,在進行讀取但是發現這樣做起來很麻

java web將圖片存到儲資料庫資料庫中讀取圖片(base64)

一、分析一下基本流程    從前臺頁面獲取圖片,後臺接收圖片檔案轉化成資料,然後儲存到資料庫,然後反向輸出到jsp頁面二、分析一下資料轉換和資料流通  三、將圖片儲存到資料庫中     1、jsp頁面將圖片傳到後臺的過程        jsp頁面將圖片通過form表單提交,後

以ado方式連結sqlserver資料庫access資料庫 語言c++

ADO中最重要的物件有三個:Connection、Recordset和Command,分別表示連線物件、記錄集物件和命令物件。 三個物件對應的智慧指標分別是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。 ADO使用_Connecti