自建轻量级数据库服务器的探索之旅

在进行一个大型项目开发时,发现自己对现有的数据库选项并不满意。网络上充斥着各种“X对比Y”的性能测试,其中MS-SQL Server的表现并不尽如人意,更不用说其成本和资源消耗了。MySQL、PostgreSQL等其他数据库虽然各有千秋,但同样没有完全满足需求。想要的是一个能够让自由选择服务器功能的数据库引擎,性能要像SQLite那样出色,而且最好是免费的。

这意味着需要自己编写一个。

开始在网上搜索,发现了一个2004年由Alex K.发起的项目,这是唯一一个看起来比较靠谱的结果(他的项目可以在这里找到)。获得了他的许可来使用他的代码(实际上,是在发表这篇文章之前问他的...),采用了他的一些代码,并写了很多新的代码。对于那些曾经接触过他的代码的人来说,一些函数名可能会听起来很熟悉。

然而,他的代码存在四个主要问题,不太喜欢:

  1. 他在网络间传递句柄(!)。
  2. 他每次编译语句并逐步执行。
  3. 他实际上包装的是SQLite 2而不是SQLite 3...
  4. VC2005在线程中发现了内存泄漏!!!

问题1的关键在于,客户端和服务器之间的通信必须是透明的,不应该有句柄之类的东西。问题2在于它产生了太多的开销。应该执行一个SQL查询,一次性获得结果,仅此而已!(至少是这么看的...)问题3在于,大多数人,包括,喜欢在SQLite引擎更新时更新它,尤其是当更新声明“修复了一个小错误”时。问题4嘛...嗯...不知道...喜欢内存泄漏吗?

基本上,做了以下事情:

  • 取了套接字处理函数,稍微调整了一下,用getaddrinfo替换了gethostbyname,以便支持IPv6。IPv4基本上已经过时了。
  • 重写了线程处理类,架构相同,有些地方有所不同,但必须确保没有内存泄漏。
  • 栈类几乎未受影响;主要改变的是它们的命名...也重写了处理类,基本架构相同,甚至函数名也相同。此外,还添加了对SQL执行和SELECT查询的支持!:-)

在客户端,添加了一个接口,这个接口完全来自于SQLite包装类,所以不需要解析表格结果并从UTF8转换...它为做了所有这些。还有一件重要的事情 - 添加了对服务器用户认证的支持。

不会告诉写的每一段代码,所以只能下载并自己看。也不打算在这里写任何文档!没有时间。此外,代码基本上是自解释的。

注意:如果计划为Win2K/Me/98/95编译,需要包含wspiapi.h,因为使用了getaddrinfo。似乎在WinXP之前,IPv6还不是标准,正如MSDN中所述。

P.S. - 如果有人足够认真,并想将这个SQLite服务器/客户端的事情向前推进,请自便。在SourceForge上发布或类似的地方,跟踪事情,文档等...没有时间...

使用代码

在编写库时,不得不编写一个演示应用程序来测试它们...所以它们包含在同一个解决方案中。解决方案基本上包括:服务器类、客户端类、服务器应用程序和客户端测试应用程序。如果想使用代码,只需包含相关库即可。此外,要编译服务器库,必须包含SQLite3库/DLL/源代码,可以从这里获得。(预期的sqlite3.h文件位于子文件夹./SQLite/中。)

更新21/01/2008:现在ZIP文件也包含SQLite3源代码,因为似乎许多用户就是不知道如何去SQLite网站,下载源代码,并将其包含在项目中...意思是,伙计们!不能这样做,但可以使用SQL???

对于安全部分:服务器库的默认模式是不需要认证的。除非编写了一个认证类并将其附加到服务器。所做的是编写了一个接口类,应该派生它。在服务器演示应用程序中,创建了一个名为CINIAuth的类,它管理INI文件中的用户/密码/权限。当然,这不是最安全的方式,但如果需要更多的安全性,可以轻松地编写一个类,加密密码并存储在喜欢的任何地方。(天哪!甚至可以在SQLite数据库中!)

更新21/01/2008:服务器现在使用SHA512加密密码!

更新21/01/2008:现在,服务器可以作为服务运行。它作为托盘图标工作,并接受命令行参数:

Arguments: /instsvc - 安装为服务。 /remsvc - 卸载服务。 /minimize - 启动时最小化到托盘。 /start - 启动时开始监听。 /port: [port_num] - 将服务器监听端口设置为[port_num]。(不会将此端口保存到settings.ini中。) /? or /help - 此消息。

在看来,现在所要做的就是看看代码,然后试试...所以,继续吧!

有趣的点

“在写代码时学到了什么有趣/好玩/烦人的东西吗?有没有做过什么特别聪明/疯狂/古怪的事情?”(www.codeproject.com)

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485