三种主要嵌入式数据库

什么是嵌入式数据库

嵌入式数据库与非嵌入式数据库的差别,在于运行模式的差别。并不是运行在嵌入式手持设备上的数据库就是嵌入式数据库,那种数据库我们通常称做嵌入式移动数据库。理论上讲,嵌入式设备一样可以运行网络数据库的服务端程序。

嵌入式数据库是指运行在本机上、不用启动服务端的轻型数据库,它与应用程序紧密集成,被应用程序所启动,并伴随应用程序的退出而终止。

从这个意义上讲,似乎所有单机数据库都可以算嵌入式数据库,比如Access,Paradox,DBF等等,因为它们都不用启动数据库服务器即可使用。然而,我们通常不将上述数据库归入嵌入式数据库,而只将它们归入“桌面数据库”,甚至“文件型数据库”,因为这些数据库的完备性、存储容量及性能方面存在较大的缺陷。

嵌入式数据库支持的数据都是TB文件级别,更由于嵌入式数据库具备高性能的特点,可以预测,单机数据库的未来将是嵌入式数据库的天下。

嵌入式数据库三雄
目前,嵌入式数据库市场主要由三个产品分割:SQLite,Birkeley DB,Firebird嵌入服务器版,巧的是,这三个数据库产品都是开源软件。

 

SQLite

主页:http://www.sqlite.org

SQLite诞生于2000年5月,这几年增长势头迅猛无比,目前版本是3.3.8。

SQLite的特点如下:

1、无需安装配置,应用程序只需携带一个动态链接库。

2、非常小巧,For Windows 3.3.8版本的DLL文件才374KB。

3、ACID事务支持,ACID即原子性、一致性、隔离性、和持久性(Atomic、Consistent、Isolated、和 Durable)。

4、数据库文件可以在不同字节顺序的机器间自由的共享,比如可以直接从Windows移植到Linux或MAC。

5、支持数据库大小至2TB。

 

 

Berkeley DB

主页:http://www.oracle.com/database/berkeley-db/index.html

Berkeley DB是由美国Sleepycat Software公司开发的一套开放源码的嵌入式数据库的程序库,它于1991年发布,号称“为应用程序开发者提供工业级强度的数据库服务”,可谓是老牌悍将。Sleepycat现已被甲骨文(ORACLE)公司收购。

Berkeley DB的特点如下:

1、嵌入式,无需安装配置。

2、为多种编程语言提供了API接口,其中包括C、C++、Java、Perl、Tcl、Python和PHP等等。

3、轻便灵活。它可以运行于几乎所有的UNIX和Linux系统及其变种系统、Windows操作系统以及多种嵌入式实时操作系统之下。

4、可伸缩。它的Database library才几百KB大小,但它能够管理规模高达256TB的数据库。它支持高并发度,成千上万个用户可同时操纵同一个数据库。

 

 

Firebird嵌入服务器版(Embedded Server)

主页:http://www.firebirdsql.org

从Interbase开源衍生出的Firebird,充满了勃勃生机。虽然它的体积比前辈Interbase缩小了几十倍,但功能并无阉割。为了体现Firebird短小精悍的特色,开发小组在增加了超级服务器版本之后,又增加了嵌入版本,最新版本为2.0。

Firebird的嵌入版有如下特色:

1、数据库文件与Firebird网络版本完全兼容,差别仅在于连接方式不同,可以实现零成本迁移。

2、数据库文件仅受操作系统的限制,且支持将一个数据库分割成不同文件,突破了操作系统最大文件的限制,提高了IO吞吐量。

3、完全支持SQL92标准,支持大部分SQL-99标准功能。

4、丰富的开发工具支持,绝大部分基于Interbase的组件,可以直接使用于Firebird。

5、支持事务、存储过程、触发器等关系数据库的所有特性。

6、可自己编写扩展函数(UDF)。

嵌入式数据库特性对比
产品名称

SQLite

Berkeley DB

Firebird嵌入服务器版

当前版本

3.3.8

4.5.20

2.0

速度

最快

稳定性

数据库容量

2TB

256TB

64TB

SQL支持

大部份SQL- 92

不支持

完全SQL-92与大部份SQL-99

Win32平台下最小体积

374KB

840KB

3.68MB

数据操纵

SQL

仅应用程序接口

SQL

开发接口

C, C++, PHP, Java, Delphi, Python .net(有些是第三方厂商开发的)

从以上对比中,我们可以看到,最短小精悍的是SQLite,它的性能也是最高的,Berkeley DB比较特殊,因为它不是用SQL语言来操纵数据的,Firebird嵌入版的体积对比之下显得稍大了些,但它对关系数据库特性的支持是最好的,如果要考虑到今后或许要将数据库升级成网络版本,就要选Firebird了。

嵌入式数据库开发布署举例
例1、用Delphi开发基于SQLite的单机版应用程序

因为SQLite自带C、C++、Java接口,所以我这里举用Delphi开发的例子。

使用组件:第三方组件ASQLite。

下载地址:http://www.aducom.com/cen/download.php?list.2

选择后边是.D的,就是for Delphi的组件。

下载解压之后,即可开始用Delphi打开dpk组件包编译安装。

如果您的Delphi版本比较高,比如是Delphi 2006,那么就编译asqlite3.dpk与asqlite3pkg.dpk,之后再安装asqlite3pkg.dpk包即可。

然后在Delphi组件面板里可以看得到ASQLite组件,如图:

 

现在就可以用它开发你的程序了,基于SQLite小巧的原因,特别推荐你在布署远程应用时用它,比如监控啊,木马啊什么的。

OK,为了使我们的例子更详细,下面讲讲怎么用ASQLite组件创建、连接数据库,并建立一个数据表。

新建一个窗体,放一个TASQLite3DB,命名为DB1,将它的Database(数据库)设为test.sqb,放一个TASQLite3Query,命名为Query1,将它的Connection指向DB1,然后放入两个按钮,第一个按钮的作用是创建或连接数据库,第二个按钮的作用是建立数据表。

如下图:

 

“连接”按钮事件的代码如下:

DB1.Open;

执行完这条语句之后,如果应用程序当前目录下不存在test.sqb文件,则自动创建并连接它。

“建表”按钮事件的代码如下:

  Query1.StartTransaction;

  try

    Query1.Close;

    Query1.SQL.Text:='create table student(sname vchar(30),age integer)';

    Query1.ExecSQL;

    Query1.Commit;

  except

    Query1.RollBack;

  end;

执行完这些语句之后,在Test.sqb数据库里将创建数据表student。

现在,请将您下载的SQLite的动态链接库sqlite3.dll文件复制到应用程序目录下。

之后,可正常运行。

布署时,也应将sqlite3.dll文件一起打包。

例2、使用C++语言开发基于Firebird嵌入版的应用程序。

由于Firebird衍生于Interbase,所以Delphi对它的支持最好,IBX,DBX,Fibplus等都可以直接使用它,只要注意将接口文件改为fbembed.dll即可。在此不再多言。

对于C++这种最通用的语言,我们有一个更好的组件可以选择:IBPP。

IBPP主页:http://www.ibpp.org/

IBPP是用C++封装的Firebird接口,最新版本2.5.2.2。

只要在C++里引用all_in_one.cpp文件,就可以使用它的功能。

可以用IBPP:atabase类连接数据库,用IBPP::Transaction类控制事务,IBPP::Statement类可以获取数据集。下面展示一段代码,功能为:先连接d:/demo.fdb文件,然后从student表里选择所有记录,遍历所有记录之后,显示最后一条记录的sn与sname字段。为了使演示更直观,省去了异常处理。

示例代码:

#define IBPP_WINDOWS  //运行于Windows平台的预先声明

#include "ibpp/all_in_one.cpp"

……

IBPP:atabase db1;

db1=IBPP:atabaseFactory("","d:/demo.fdb","sysdba","masterkey";

db1->Connect();

IBPP::Transaction tr1=IBPP::TransactionFactory(db1,IBPP::amWrite,

IBPP::ilConcurrency,IBPP::lrWait, IBPP::tfNoAutoUndo);

tr1->Start();

IBPP::Statement st1=IBPP::StatementFactory(db1,tr1);

st1->Prepare("select * from student";

st1->Execute();

std::string sn,sname;

st1->Fetch();

st1->Get(1,sn);

st1->Get(2,sname);

tr1->Commit();

Label1->Caption=sn.c_str();

Label2->Caption=sname.c_str();

最后2行语句为显示结果的,不同开发平台应该使用不同的方法演示,请勿直接复制源代码。

布署时,还应该带上如下文件:fbembed.dll,ib_util.dll,icudt30.dll,icuin30.dll,icuuc30.dll,为了更通用,还可以带上VC++ 7.1的运行库msvcp71.dll,msvcr71.dll两个文件。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注