什么是嵌入式数据库
嵌入式数据库与非嵌入式数据库的差别,在于运行模式的差别。并不是运行在嵌入式手持设备上的数据库就是嵌入式数据库,那种数据库我们通常称做嵌入式移动数据库。理论上讲,嵌入式设备一样可以运行网络数据库的服务端程序。
嵌入式数据库是指运行在本机上、不用启动服务端的轻型数据库,它与应用程序紧密集成,被应用程序所启动,并伴随应用程序的退出而终止。
从这个意义上讲,似乎所有单机数据库都可以算嵌入式数据库,比如Access,Paradox,DBF等等,因为它们都不用启动数据库服务器即可使用。然而,我们通常不将上述数据库归入嵌入式数据库,而只将它们归入“桌面数据库”,甚至“文件型数据库”,因为这些数据库的完备性、存储容量及性能方面存在较大的缺陷。
嵌入式数据库支持的数据都是TB文件级别,更由于嵌入式数据库具备高性能的特点,可以预测,单机数据库的未来将是嵌入式数据库的天下。
嵌入式数据库三雄
目前,嵌入式数据库市场主要由三个产品分割:SQLite,Birkeley DB,Firebird嵌入服务器版,巧的是,这三个数据库产品都是开源软件。
SQLite
主页:
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
主页:
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)
主页:
从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。
下载地址:
选择后边是.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主页:
IBPP是用C++封装的Firebird接口,最新版本2.5.2.2。
只要在C++里引用all_in_one.cpp文件,就可以使用它的功能。
可以用IBPP:atabase类连接数据库,用IBPP:ransaction类控制事务,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:ransaction tr1=IBPP:ransactionFactory(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两个文件。