摘 要: 与常见的数据库相比,嵌入式数据库具有体积小、功能齐备、可移植性、健壮性等特点,本文分析和比较了典型的嵌入式数据库SQLite和Berkeley DB。首先从体系结构、子系统间调用关系、任务执行过程等角度对SQLite和Berkeley DB进行了详细分析,然后重点从数据类型、存储方式、模式、数据库引擎和错误处理及加密功能等方面讨论了SQLite和Berkeley DB的异同点,最后列举了一个基于ARM—Linux的SQLite应用实例。
关键词: SQLite、Berkeley DB、SQL、虚拟数据库引擎(VDBE)
引言
随着计算机技术与其它学科间的不断交融、渗透,数据库应用的范围更加深入和具体。那些仅适用于PC机,体积庞大、延时较长的数据库技术已不能满足针对性较强的嵌入式系统开发的需求。SOLite和Berkeley DB是目前应用较广泛、技术较稳定的两种嵌入式数据库。然而,国内对嵌入式数据库的研究起步较晚,还没能引起更多人的关注。更多人熟悉那些基于C/S或B/S结构的关系型数据库来实现数据的存储、检索等功能。然而,在嵌入式系统中,由于软硬件资源有限,不可能安装庞大的数据库服务器,而用户的需求可能由一个简单的基于磁盘文件的数据库系统就能实现,这仅仅是利用了那些数据库的基本特性。此时,对嵌入式数据库的研究就显得尤为重要了。
1嵌入式数据库
嵌入式数据库通常是与嵌入式操作系统及具体的应用集成在一起,无需独立运行数据库引擎,由程序直接调用相应的API就可实现对数据的存取操作。嵌入式系统的开发环境决定了其数据库的特点:
1、 体积适当
由于嵌入式系统自身的特点,对数据的存储和程序的运行都有较强的空间限制,所以嵌入式数据库首先应该保障的就是适当的体积。进一步来说就是占用尽量少的ROM、RAM及CPU的资源。
2、 功能齐备
嵌入式系统开发中,用户需求决定了需要一个大小适中、功能齐备的数据库来实现数据
管理,这就使得开发人员要采用一个能够提供完备开发文档且易于开发的数据库技术。此外,
国家863项目2002AA714023,研究生精品课程资助05531451
在嵌入式设备中,数据库的管理对用户来说是透明的,这就要求此数据库能够自动完成启动初始化、日志管理、数据压缩、备份、数据恢复等功能;而且嵌入式设备经常有不可预料的硬复位,这就需要此数据库有高度的健壮性。
3、 可移植性
嵌入式系统的平台种类繁多,因此嵌入式数据库应有一定的可移植性,以适用于不同的软硬件平台。
4、代码开源
开源的代码在产品的开发过程中不仅可以减少开发成本,更重要的是为后期的维护完善和稳定运行都提供了最为彻底的解决方法。
2 SQLite
SQLite是D.理查德.希普用一个小型的C库开发的一种强有力的嵌入式关系数据库管理体制。虽然功能较Berkeley DB稍显逊色,但它简单易学、速度较快,同时提供了丰富的数据库接口,提供了对SQL92的大多数支持:支持多表和索引、事务、视图、触发和一系列的用户接口及驱动。
SQLite的体系结构大体上可以分成八个主要的子系统,如图1所示。对数据库进行的各种操作都是按照此顺序,逐一执行的。顶层是标记处理器(tokenize)和分析器(parser)。SQLite有自己高度优化的代码生成器,可以快速、高效地生产出代码。底部是经过优化的B树,这样有助于运行在可调整的页面缓冲上时,对磁盘的查找降低到最小。再往下是页面高速缓存,它作用在OS的抽象层之上,这样的体系结构使数据库的可移植性变为可能。
该体系结构的核心是虚拟数据库引擎(VDBE)。VDBE完成与数据操作相关的全部任务,并且是客户和存储之间信息交换的中间单元。从各个角度分析,它都是SQLite的核心。当SQL语句被分析后,VDBE便开始工作。代码生成器将分析树翻译成一个袖珍程序,随后这些袖珍程序又被组合成VDBE的虚拟机器语言表示的一系列指令。如此反复,VDBE执行每条指令,最终完成SQL语句指定的查询要求。
SQLite有以下特性:支持ACID事务、零配置―无需安装和管理配置、存储在单一磁盘文件中的一个完整的数据库、数据库文件可以在不同字节顺序的机器间自由共享、支持数据库大小至2TB、足够小、全部源码大致3万行C代码,250KB、比目前流行的大多数据库运行速度快,提供了对事务功能和并发处理的支持、应用Transaction既保证了数据的完整性,也会提高运行速度,因为多条语句一起提交给数据库的速度会比逐一提交的方式更快、独立、没有额外依赖。
3 Berkeley DB
Berkeley DB是由sleepycat software开发的轻量级嵌入式数据库,它不仅适用于嵌入式系统,而且可以直接连接到应用程序内部,和应用程序运行在同一地址空间。传统的数据库一般作为独立服务器工作,而Berkeley DB是软件开发库,开发者将它嵌入到应用程序中,应用程序本身就是一个服务器,而只是利用嵌入式数据库开发来实现定制的数据库逻辑,避免了与应用服务器进程间通信的开销,因此Berkeley DB具有较高的运行效率,适用于资源受限的嵌入式系统。
一般而言,Berkeley DB数据库系统可以大致分为五个子系统,如图2所示。
1、 存取管理子系统(Access Methods)
该子系统为创建和访问数据库文件提供基本的支持。在没有事务管理的情况下,该子系统中的模块可单独使用,为应用程序提供快速高效的数据存取服务。
2、 内存池管理子系统(Memory Pool)
该子系统就是Berkeley DB所使用的通用共享内存缓冲区,该子系统可以被应用程序单独使用。
3、 事务子系统(Transaction)
该子系统为Berkekey DB提供事务管理功能,保证操作的原则性、一致性和孤立性。事务子系统适用于对需要事务保证的数据进行修改的场合。
4、 锁子系统(Locking)
该子系统提供进程之间以及进程内部的并发管理机制,为系统提供多用户读取和单用户修改同一对象的共享控制。该子系统可以被应用程序单独使用。
5、 日志子系统(Logging)
该子系统采用的是先写日志的策略,信捷职称论文写作发表网,支持事务子系统进行数据恢复,保证数据一致性。
4、SQLite与Berkeley DB的异同
通过上面的一些介绍,也许会对SQLite和Berkeley DB有了一定的了解。从目前的趋势看,这两款嵌入式数据库有着旺盛的生命力,较好的应用领域及发展空间。笔者翻阅了大量的资料,从各个角度,对它们的异同进行了多方面,多层次的比较,如表1所示。
表1 SQLite与Berkeley DB的异同
特性
SQLiteBerkeley DB
是否为关系数据库
是否支持SQL
开发语言
数据类型
存储方式
存储模式
数据库引擎
适用系统
错误处理
加密功能
是否免费
难易程度
是
是
C语言
无
转换成ASCII码
Btree
虚拟
从ARM/Linux到SPARC/Solaris多种硬件平台
较少
弱
全部
较易
否
否
C、Java语言
无
原样存储
Btree、Hash、Queue和Recno
无
UNIX/POSIX systems、Win32及嵌入式系统WinCE、VxWorks等
较详细
强
部分
较难
通过此表我们可以较为直观地看到,SQLite和Berkeley DB在数据库类型、开发语言、存储方式、模式等方面有着较大的差异。下面笔者就对其中某些重要方面进行相对详细的论述:
1、 数据库类型
SQLite基于关系数据库模式,支持绝大多数标准的SQL92语句,在很大程度上实现了ANSI SQL92标准,特别是支持视图、触发器、事务,支持嵌套SQL。它通过SQL编译器(SQL Complier)来实现SQL语言对数据库进行操作,采用单文件存放数据库。在操作语句上更类似关系型数据库的产品使用,非常方便。这也就使得那些曾经有过PC机数据库经验的人,对SQLite的学习变得易如反掌。
此外,SQLite也有API的概念,而且极其易于使用,只需要三个用来执行SQL和获得数据的函数