记得之前在公司上班时,有时候白天的活没干完,我就会把工做带回家晚上加班继续作。可是,咱们开发用的数据库是部署在公司局网内部的一台服务器上的,在家里是确定连不上这台机器的。在家里没有数据库,服务端就跑不起来,功能也就没办法调试。后来咱们的解决方法就是使用虚拟数据库。在公司上班时,就使用公司局网的真实数据库;回到家,就使用内存中虚拟的数据库,作一些基本的功能调试,绝对是足够了。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演示使用了。
咱们首先回忆一下,经典OO设计原则中的一个:里氏替换原则。这个原则是这样说的:全部引用基类的地方必须可以透明地使用其子类的对象。
彷佛有点拗口,下面就结合GG中的实现解释一下:
(1)GG中用于表示虚拟数据库的类是VirtualDB类,用于表示真实数据库的类是RealDB类。
(2)VirtualDB类和RealDB类都从接口IDBPersister接口继承。
(3)可是,GG服务端程序中凡是涉及到数据库访问操做的地方,既不使用VirtualDB、也不使用RealDB,而是使用IDBPersister。
这样,咱们就只须要在程序启动的时候,指定将VirtualDB实例或RealDB实例指派给IDBPersister引用,就可让整个服务端统一地访问虚拟数据库或是真实数据库了。
结合这个实例,咱们把里氏替换原则放到这个场景中,其意思就是:在程序中不要依赖具体的实现类(VirtualDB和RealDB),而是依赖于它们的共同接口(IDBPersister)。这样,替换就很方便了。
若是打算将使用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是可在广域网部署运行的QQ高仿版,2013.8.7发布V1.0版本,至今最新是4.4版本,关于GG更详细的介绍,能够查看 可在广域网部署运行的QQ高仿版 -- GG2014总览。
在GG的最新版本中使用了上述方案以支持在真实数据库和虚拟数据库之间相互切换。
________________________________________________________________________
欢迎和我探讨关于 GG 和 GGMeeting 的一切,个人QQ:2027224508,多多交流!
你们有什么问题和建议,能够留言,也能够发送email到我邮箱:2027224508@qq.com。
若是你以为还不错,请粉我,顺便再顶一下啊