sqlite嵌入式移植评估

前端之家收集整理的这篇文章主要介绍了sqlite嵌入式移植评估前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


嵌入式数据库简介

嵌入式数据库是嵌入到应用程序中的轻量级数据库,其操作具有定时限制的特性。它是嵌入式系统的重要组成部分,也成为对越来越多的个性化应用开发和管理而采用的一种必不可少的有效手段。嵌入式运行模式允许嵌入式数据库通过 sql 来轻松管理应用程序数据,而不依靠原始的文本文件。嵌入式数据库还提供零配置运行模式,这样可以启用其中一个并运行一个快照。
常见嵌入式数据库简介
sqlite(开源)
sqlite简介:
sqlite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,主要特点如下:
简单:sqlite是一个非常轻量级自包含(lightweight and self-contained)的DBMS:一个头文件,一个动态库文件,就包含了关系数据库的所有功能了。它提供的API少而简单。
小巧:整个系统少于3万行代码,少于250KB的内存占用(gcc),大部分应用比目前常见的客户端/服务端的数据库快,没有其它依赖
并发性:由于sqlite通过OS的文件锁来实现库级锁,粒度很大,但是,它通过一些复杂特殊的处理,尽量的提升了读写的并发度。
sql92:sqlite支持绝大部分的标准sql语句,你只需要几百K的空间,就可以换来需要上百兆的通用DBMS几乎所有操作了。
Berkeley DB(开源限个人)
Berkeley DB是一个开源的文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库函数,而不是像关系数据库那样需要网络通讯、sql解析等步骤。其主要技术特点:
Berkeley DB是一个开放源代码的内嵌式数据库管理系统,能够为应用程序提供高性能的数据管理服务。应用它程序员只需要调用一些简单的API就可以完成对数据的访问和管理。(不使用sql语言)
Berkeley DB为许多编程语言提供了实用的API接口,包括C、C++、Java、Perl、Tcl、Python和PHP等。所有同数据库相关的操作都由Berkeley DB函数库负责统一完成。
Berkeley DB轻便灵活,可以运行于几乎所有的UNIX和Linux系统及其变种系统、Windows操作系统以及多种嵌入式实时操作系统之下。Berkeley DB被链接到应用程序中,终端用户一般根本感觉不到有一个数据库系统存在。
Berkeley DB是可伸缩的,这一点表现在很多方面。Database library本身是很精简的(少于300KB的文本空间),但它能够管理规模高达256TB的数据库。它支持高并发度,成千上万个用户可同时操纵同一个数据库。Berkeley DB能以足够小的空间占用量运行于有严格约束的嵌入式系统。
Berkeley DB在嵌入式应用中比关系数据库和面向对象数据库要好,有以下两点原因:
因为数据库程序库同应用程序在相同的地址空间中运行,所以数据库操作不需要进程间的通讯。在一台机器的不同进程间或在网络中不同机器间进行进程通讯所花费的开销,要远远大于函数调用的开销;
因为Berkeley DB对所有操作都使用一组API接口,因此不需要对某种查询语言进行解析,也不用生成执行计划,大大提高了运行效。
extreme DB(开源)
eXtremeDB内存嵌入式实时数据库以其高性能、低开销、稳定可靠的极速实时数据管理能力在嵌入式数据管理领域及服务器实时数据管理领域独领风骚。eXtremeDB已经广泛应用于众多行业及领域,如:网络设备、消费电子、国防、航空航天、工业控制、轨道交通、能源电力、医疗设备,地理信息、汽车电子,以及金融实时交易、通信技术、互联网等,得到了国内外许多知名客户的一致好评与青睐。其主要特点:
内存数据库,eXtremeDB将数据以程序直接使用的格式保存在主内存之中,不仅剔除了文件I/O的开销,也剔除了文件系统数据库所需的缓冲和Cache机制。其结果是每个交易一微秒甚至更少的极限速度,相比于类磁盘数据库而言,速度成百上千倍地提高。作为内存数据库,eXtremeDB不仅性能高,而且数据存储的效率也非常高。为了提高性能并方便程序使用,数据在eXtremeDB中不做任何压缩,100M的空间可以保存高达70M以上的有效数据,这是其他数据库所不可想象的。
混合数据库,eXtremeDB不仅可以建立完全运行在主内存的内存数据库,更可以建立磁盘/内存混合介质的数据库。在eXtremeDB,我们把这种建立在磁盘、内存或磁盘+内存的运行模式称为eXtremeDB Fusion融合数据库。eXtremeDB Fusion兼顾数据管理的实时性与安全性要求,是实时数据管理的台阶性进步。
嵌入式数据库,eXtremeDB内核以链接库的形式包含在应用程序之中,其开销只有50KB~130KB。无论在嵌入式系统还是在实时系统之中,eXtremeDB都天然地嵌入在应用程序之中,在最终用户毫不知情的情况下工作。eXtremeDB的这种天然嵌入性对实时数据管理至关重要:各个进程都直接访问eXtremeDB数据库,避免了进程间通信,从而剔除了进程间通信的开销和不确定性。同时, eXtremeDB独特的数据格式方便程序直接使用的,剔除了数据复制及数据翻译的开销,缩短了应用程序的代码执行路径。
由应用定制的API,应用程序对eXtremeDB数据库的操作接口是根据应用数据库设计而自动产生,不仅提升了性能,也剔除了通用接口所必不可少的动态内存分配,从而提高了应用系统的可靠性。定制过程简单方便,由高级语言定制eXtremeDB数据库中的表格、字段、数据类型、事件触发、访问方法等应用特征,通过eXtremeDB预编译器自动产生访问该数据库的C/C++ API接口。
可预测的数据管理:eXtremeDB独特的体系结构,保证了数据管理的可预测性。eXtremeDB不仅更快、更小,而且更确定。在80双核cpu的服务器上,eXtremeDB在1TB内存里保存15B条记录;无论记录数多少,eXtremeDB可以在八十分之一微秒的时间内提取一条记录。
Empress(商业)
Empress实时数据库是基于知识和规则的关系型的稳定可靠的数据库系统,具有免维护、适应性强、模块化、全分布、多平台、易裁剪、可扩展和开放性强的优点。其嵌入式数据库主要特点如下:可以设置成多种不同的工作方式,以满足不同的商务模式需要。基本的模式分为:独立运行模式和客户端/服务器模式。其中独立运行模式不需要运行独立的Empress数据库服务器,Empress的引擎库直接和应用程序连接。对于在同一地址空间中运行的嵌入式数据库的应用,独立运行模式是非常有吸引力的。这两种应用模式可以在同一操作统中同时使用。
一致性:Empress面向嵌入式的丰富的锁功能保证各种操作之间的数据一致。Empress不仅支持常见的记录锁、表锁和组锁,还支持用户自定义的锁粒度和支持事务分离级别的各种锁。Empress具有丰富的数据同步功能。不仅支持1对N的各种数据同步,还支持N对N的各种数据同步功能。来保证数据库的高可用性
多重访问性:Empress支持多进程/多线程,保证数据库能够同时被多个用户或程序访问。多个用户可以同时访问数据库内的同一个对象,大大的提高了数据库的访问速度和利用率。同时,利用有效的锁机制和其他一致性机制可以保证数据的安全性和系统的稳定性的前提下,使数据库的处理速度和资源的利用率达到最大化。
嵌入性:Empress嵌入式数据库引擎是以组件的形式存在,具有真正的嵌入性。客户只需要像调用自己定义的函数那样调用相应的函数就可以动态创建表及其他对象、插入删除数据等常规的数据库操作。客户在自己的产品发布时,可以将Empress数据库编译到自己的产品内,变成自己产品的一部分,最终用户是感受不到数据库的存在的,也不用特意去维护数据库
实时性:实时性和嵌入性是分不开的。只有具有了嵌入性的数据库才能够第一时间得到系统的资源,对系统的请求在第一时间内作出响应。但是,并不是具有嵌入性就一定具有实时性。要想嵌入式数据库具有很好的实时性,必须做很多额外的工作。比如:Empress实时数据库将嵌入性和高速的数据引擎、定时功能以及防断片处理等措施整合在一起来保证最基本的实时性。
Firebird(开源)
firebird是一个全功能的,强大高效的,轻量级,免维护的数据库。它很容易让您从单用户,单数据库升级到企业级的应用。主要特点:
支持原子性,并发性,隔离性等概念。
支持事务的多个版本功能
使用Psql(Procedure sql),你可以创建强大的存储过程来处理服务上的所有数据,你可以使用select Stored Procedure的形式,使用存储过程,以得到一个虚拟的表结构的结果。这样的话,你就可以很容易的在报表中使用它。
存储过程和触发器可以引发事件,这个事件可以被客户端程序监听到
生成子也称为序列,它可以很容易的实现自动增加的字段。它是一个INT64的长度,因此,它可以用在一个事务中,也可以用在其它很多方面。
msql(个人免费,商业收费)
msql(mini sql)是一个单用户数据库管理系统,个人使用免费,商业使用收费。由于它的短小精悍,使其开发的应用系统特别受到互联网用户青睐。msql(mini sql)是一种小型的关系数据库性能不是太好,对sql语言的支持也不够完全,但在一些网络数据库应用中是足够了。由于msql较简单,在运行简单的sql语句时速度比MysqL略快,而MysqL在线程和索引上下了功夫,运行复杂的sql语句时比msql,Postgresql等都要快一些。
几款开源数据库的特点对比:

数据库

sqlite

Berkeley DB

Extreme DB(内存数据库

Firebird

运行时占用RAM

250KB左右

300KB左右

内核尺寸100kB(可裁剪)

数据库尺寸由用户选择

——

应用模式

组件嵌入

以组件形式内嵌在程序中

以组件嵌入程序

服务器

数据库分类

遵循ACID的关系型数据库

非关系,非对象数据库

关系,对象数据库

嵌入式服务器类,关系数据库

实时性能

微秒级别

——

使用风险

开源数据库sql支持不全

开源数据库,技术支持不到位。而且商业性应用也不是免费的

30年实时数据库行业经验,eXtremeDB是该公司当前产品,具有强实时性、高稳定性、超强壮,高可靠性等优点。

——

主要优点

代码短小,开放

零配置,无需安装

API简单

查询速度较高

丰富API接口(不用sql语言),

功能齐全,源码开放

独特的五个子系统结构

高并发

首先是实时数据库,才是嵌入式数据库

实时性较高

支持原子性,并发性,隔离性

一服务器,可以支持多个客户端

轻量级,免维护

支持sql92标准

主要缺点

不适合并发性高的场合 如大量insert,update访问,

sql标准支持不全

非关系,非对象数据库

——

——

主要应用

智能手机,常见嵌入式设备,命令行数据分析工具

嵌入式实时子系统

广泛应用于航空航天、工业控制、电信通讯、金融电子、消费电子、医疗设备等关键性运用

嵌入服务器:整个服务器引擎就是一个动态库,只支持本地通过IO进行调用




sqlite数据库移植评测

选取sqlite数据库,移植到arm,首先,在网上下载sqlite源码包: http://sqlite.org/download.html。下载后得到sqlite-autoconf-3080403.tar.gz 此次嵌入式移植测试的平台:Atm9200(Hyesco) 操作系统:linux-2.4 开发工具:arm-linux-gcc 移植 设置目录:cp sqlite-autoconf-3080403.tar.gz /usr/local/ cd /usr/local 解压源码包: tar xvzf sqlite-3.6.17.tar.gz 创建文件夹:mkdir sqlite_arm 配置makefile:./configure --prefix=/home/local//sqlite/sqlite_arm --disable-tcl —host=arm-linux 开始编译安装,完成之后,在sqlite_arm文件夹下生成bin,include,lib,share, 1可以直接拷贝bin文件夹下应用程序和lib下库至atm9200中,在环境变量中添加lib库,即可直接在命令行终端使用 2 可以根据sqlite的include头文件和lib库,编写相应的应用程序, 测试 通过编写应用程序测试sqlite性能,可以通过查看sqlite的技术文档,查看sqlite的c/c++接口函数:主要有以下 sqlite3_open(const char *filename,sqlite3 **ppDb) 该例程打开一个指向 sqlite 数据库文件的连接,返回一个用于其他 sqlite 程序的数据库连接对象。如果 filename 参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称文件不存在,sqlite3_open() 将创建一个新的命名为该名称数据库文件并打开。 sqlite3_exec(sqlite3*,const char *sql,sqlite_callback,void *data,char **errmsg) 该例程提供了一个执行 sql 命令的快捷方式,sql 命令由 sql 参数提供,可以由多个 sql 命令组成。在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。 sqlite3_close(sqlite3*) 该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。如果还有查询没有完成,sqlite3_close() 将返回 sqlITE_BUSY 禁止关闭错误消息。 数据库基本功能测试 编写简单的sqlite测试程序,完成数据库的基本操作,测试程序见testsql文件夹。 完成:打开数据库,连接数据库,创建新数据库,对数据库实行基本操作(查找,删除,更新,插入)关闭数据库。 测试结果:可以实现基本数据库功能 数据量:4条,测试次数10次 数据库事务性测试 数据库断电测试 对sqlite数据库,正在读写操作时候,突然断电,终止程序,查看数据的完整性。编写测试程序,测试结果: 对于打开数据库断电测试,数据完整,无断电影响。 对于打开数据库并插入操作,在断电前已经插入的数据无影响,断电时未插入数据,无法保存,之前数据完整无影响。 对于打开数据库并查找操作,断电对数据库无影响。 对于打开数据库删除,更新操作,断电时未操作则数据库不变,否则数据库改变,数据库未受到断电影响。 以上测试结果,测试次数15次以上,数据量100条 数据库原子性测试 事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。 事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为 ACID: 原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。 一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。 隔离性(Isolation):使事务操作相互独立和透明。 持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。 对数据库操作语句添加result =sqlite3_exec(db,"begin transaction",&zErrorMsg)开始事物result =sqlite3_exec(db,"commit transaction",&zErrorMsg);确认事物 result =sqlite3_exec(db,"rollback transaction",&zErrorMsg);取消事物,在事物测试中可以检测到sqlite的事务,数据库单一连接下,可直接使用,如果数据库被多个使用,则应注意避免死锁。 实际测试:单一数据库连接,锁住数据库,可保证数据库更改无效 数据库多线程性能简单测试 sqlite支持三种线程模式: 单线程:这种模式下,没有进行互斥,多线程使用不安全。禁用所有的mutex锁,并发使用时会出错。当sqlite编译时加了sqlITE_THREADSAFE=0参数,或者在初始化sqlite前调用sqlite3_config(sqlITE_CONFIG_SINGLETHREAD)时启用。   多线程:这种模式下,只要一个数据库连接不被多个线程同时使用就是安全的。源码中是启用bCoreMutex,禁用bFullMutex。实际上就是禁用数据库连接和prepared statement(准备好的语句)上的锁,因此不能在多个线程中并发使用同一个数据库连接或prepared statement。当sqlite编译时加了sqlITE_THREADSAFE=2参数时默认启用。若sqlITE_THREADSAFE不为0,可以在初始化sqlite前,调用sqlite3_config(sqlITE_CONFIG_MULTITHREAD)启用;或者在创建数据库连接时,设置sqlITE_OPEN_NOMUTEX flag。 串行:sqlite是线程安全的。启用所有的锁,包括bCoreMutex和bFullMutex 。因为数据库连接和prepared statement都已加锁,所以多线程使用这些对象时没法并发,也就变成串行了。当sqlite编译时加了sqlITE_THREADSAFE =1参数时默认启用。若sqlITE_THREADSAFE不为0,可以在初始化sqlite前,调用sqlite3_config(sqlITE_CONFIG_SERIALIZED)启用;或者在创建数据库连接时,设置sqlITE_OPEN_FULLMUTEX flag 线程模式可以在sqlite编译时指定:可以通过定义sqlITE_THREADSAFE宏来指定线程模式。如果没有指定,默认为串行模式。定义宏sqlITE_THREADSAFE=1指定使用串行模式;=0使用单线程模式;=2使用多线程模式。sqlite3_threadsafe()函数的返回值可以确定编译时指定的线程模式。如果指定了单线程模式,函数返回false。如果指定了串行或者多线程模式,函数返回true。由于sqlite3_threadsafe()函数要早于多线程模式以及启动时和运行时的模式选择,所以它既不能区别多线程模式和串行模式也不能区别启动时和运行时的模式。最后一句可通过sqlite3_threadsafe函数的实现来理解sqlITE_API int sqlite3_threadsafe(void){ return sqlITE_THREADSAFE; }如果编译时指定了单线程模式,那么临界互斥逻辑在构造时就被省略,因此也就无法在启动时或运行时指定串行模式或多线程模式。 本次测试:多线程下分时访问数据库,在主线程中打开数据库,并且完成插入操作,在子线程中,对插入的数据库进行修改,在无事物锁的情况下,数据db同时被修改。在添加事物锁的情况下,同时连接数据库,开始事物,造成死锁。而事物按照两个连接都以 BEGIN IMMEDIATE开始事务,那么死锁就不会发生。在这种情况下,在同一时刻只能有一个连接进入BEGIN IMMEDIATE,其它的连接就得等待。BEGIN IMMEDIATE和BEGIN EXCLUSIVE通常被写事务使用。就像同步机制一样,它防止了死锁的产生。 数据库的稳定性测试 在单线程模式下,数据库完整工作一天(24小时以上),中途无退出,测试完成后数据完整,未出现异常,测试次数2次 结论 本次测试是基于hyesco芯片atm9200 在其上移植sqlite数据库,对数据库进行基本功能的测试,并发性测试,测试结果如下所示: 数据库基本功能测试:完成基本读写,sql语句,运算符 数据库断电测试:断电不会影响数据完整性 数据库事务性测试:sqlite具有ACID事务性 数据库多线程操作:在添加事物锁情况下,可能会造成事物死锁, 数据库稳定性测试:在ATM9200中测试,连续工作24小时,数据库无挂起,

猜你在找的Sqlite相关文章