首页 数据库 mysql教程 嵌入式数据库比较(SQLite Birkeley DB Firebird)

嵌入式数据库比较(SQLite Birkeley DB Firebird)

Jun 07, 2016 pm 03:31 PM
sqlite 嵌入式 数据库 比较

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

嵌入式数据库与非嵌入式数据库的差别,在于运行模式的差别。并不是运行在嵌入式手持设备上的数据库就是嵌入式数据库,那种数据库我们通常称做嵌入式移动数据库。理论上讲,嵌入式设备一样可以运行网络数据库的服务端程序。
      嵌入式数据库是指运行在本机上、不用启动服务端的轻型数据库,它与应用程序紧密集成,被应用程序所启动,并伴随应用程序的退出而终止。
      从这个意义上讲,似乎所有单机数据库都可以算嵌入式数据库,比如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:database类连接数据库,用IBPP::Transaction类控制事务,IBPP::Statement类可以获取数据集。下面 展示一段代码,功能为:先连接d:\demo.fdb文件,然后从student表里选择所有记录,遍历所有记录之后,显示最后一条记录的sn与 sname字段。为了使演示更直观,省去了异常处理。

示例代码:

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

#include "ibpp/all_in_one.cpp"

……

IBPP:database db1;

db1=IBPP:databaseFactory("","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两个文件。



工程实例
http://hi.baidu.com/cokee/blog/item/7ac5bc013a5cb50a1d9583da.html

2010年05月25日 星期二 13:07

因 为项目中要用到嵌入式数据库,现在网上找了一些资料了解了一下嵌入式数据。在http://blog.csdn.net/love_study /archive/2009/04/07/4053644.aspx中讲得蛮清楚。综合各自特点,最后决定选用SQLite。借鉴http: //www.codeproject.com/KB/database/CppSQLite.aspx,自己写了一个小例子,实现了创建数据库,创建表, 添加记录,删除记录,查询记录,修改记录等功能。
#include "sqlite3.h"
#include
#include
#pragma comment(lib, "sqlite3.lib")

const char* g_caDBName = "C:\\sqliteDB.db";
const char* g_caTabeName = "TB_Test";
sqlite3* g_pDB = NULL;
FILE* g_pFile = stdout;
char* g_caErrorMsg = NULL;

#define GROUP_NUM 100
char g_groupSqlStr[GROUP_NUM][256] = {0};

int Test1();   //测试创建一个新数据库,并向此数据库添加表,对表中的记录进行增,删,改,查。

int main(int argc, char* argv[])
{
Test1();
system("pause");
return 0;
}

int Test1()
{
int ret = SQLITE_ERROR;
//创建数据库
remove(g_caDBName);
ret = sqlite3_open(g_caDBName, &g_pDB);
if (!g_pDB)
{
fprintf(g_pFile, "创建数据库失败: %d\n", ret);;
return -1;
}
else
{
fprintf(g_pFile, "创建数据库: %s 成功\n", g_caDBName);
}

char sqlStr[512];

//创建表
sprintf(sqlStr, "Create Table %s(fd_id int, fd_name char(20))", g_caTabeName);
ret = sqlite3_exec(g_pDB, sqlStr, NULL, NULL, &g_caErrorMsg);
if (ret != SQLITE_OK)
{
fprintf(g_pFile, "创建表失败:%d\n", ret);
return -1;
}
else
{
fprintf(g_pFile, "创建表: %s 成功%\n", g_caTabeName);
}

//插入数据
int i = 0;
for(; i {
sprintf(g_groupSqlStr[i], "Insert into %s values(%d, '%d')", g_caTabeName, i, i);
}
clock_t startTime = clock();
sqlite3_exec(g_pDB, "Begin Transaction;", NULL, NULL, &g_caErrorMsg);
for(i = 0; i {
sqlite3_exec(g_pDB, g_groupSqlStr[i], NULL, NULL, &g_caErrorMsg);
}
sqlite3_exec(g_pDB, "Commit Trans;", NULL, NULL, &g_caErrorMsg);
clock_t endTime = clock();
fprintf(g_pFile, "插入%d条数据,花费%d毫秒\n", GROUP_NUM, endTime - startTime);

//查询数据条数
const char* pTail;
sqlite3_stmt* stmt;
sprintf(sqlStr, "select count(*) from %s", g_caTabeName);
ret = sqlite3_prepare(g_pDB, sqlStr, strlen(sqlStr), &stmt, &pTail);
if (ret != SQLITE_OK)
{
fprintf(g_pFile, "查询记录条数失败");
return -1;
}
else
{
int recordCount = 0;
ret = sqlite3_step(stmt);
if (ret != SQLITE_ROW)
{
fprintf(g_pFile, "查询记录失败: %d", ret);
return -1;
}

recordCount = sqlite3_column_int(stmt, 0);

fprintf(g_pFile, "共有%d条记录\n", recordCount);
}

sqlite3_finalize(stmt);

//列出表中所有的数据
fprintf(g_pFile, "%10s%10s\n", "ID", "Name");
sprintf(sqlStr, "select FD_ID, FD_Name from %s", g_caTabeName);
ret = sqlite3_prepare(g_pDB, sqlStr, strlen(sqlStr), &stmt, &pTail);
if (ret != SQLITE_OK)
{
fprintf(g_pFile, "查询记录条数失败");
return -1;
}
else
{
int id;
char name[256];

do 
{
ret = sqlite3_step(stmt);
if (ret == SQLITE_DONE)
{
break;
}
else if(ret != SQLITE_ROW)
{    
fprintf(g_pFile, "查询记录失败: %d", ret);
return -1;
}
id = sqlite3_column_int(stmt, 0);
strcpy(name, (const char*)sqlite3_column_text(stmt, 1));
fprintf(g_pFile, "%10d%10s\n", id, name);
} while(true);
}
sqlite3_finalize(stmt);

//修改数据
startTime = clock_t();
sprintf(sqlStr, "Update TB_Test Set FD_Name = 'New Name' where FD_ID > 40 and FD_ID endTime = clock_t();
ret = sqlite3_exec(g_pDB, sqlStr, NULL, NULL, &g_caErrorMsg);
if (ret != SQLITE_OK)
{
fprintf(g_pFile, "修改失败:%d\n", ret);
return -1;
}
int rowsEffect = sqlite3_changes(g_pDB);
fprintf(g_pFile, "修改了%d条数据, 消耗%d毫秒\n", rowsEffect, endTime - startTime);

//删除数据
startTime = clock_t();
sprintf(sqlStr, "Delete from TB_Test where FD_ID > 40 and FD_ID endTime = clock_t();
ret = sqlite3_exec(g_pDB, sqlStr, NULL, NULL, &g_caErrorMsg);
if (ret != SQLITE_OK)
{
fprintf(g_pFile, "删除失败:%d\n", ret);
return -1;
}
rowsEffect = sqlite3_changes(g_pDB);
fprintf(g_pFile, "删除了%d条数据, 消耗%d毫秒\n", rowsEffect, endTime - startTime);


sqlite3_close(g_pDB);

return 0;
}

(#)


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Hibernate 如何实现多态映射? Hibernate 如何实现多态映射? Apr 17, 2024 pm 12:09 PM

Hibernate多态映射可映射继承类到数据库,提供以下映射类型:joined-subclass:为子类创建单独表,包含父类所有列。table-per-class:为子类创建单独表,仅包含子类特有列。union-subclass:类似joined-subclass,但父类表联合所有子类列。

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 Jul 18, 2024 am 05:48 AM

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

深入解析HTML如何读取数据库 深入解析HTML如何读取数据库 Apr 09, 2024 pm 12:36 PM

HTML无法直接读取数据库,但可以通过JavaScript和AJAX实现。其步骤包括建立数据库连接、发送查询、处理响应和更新页面。本文提供了利用JavaScript、AJAX和PHP来从MySQL数据库读取数据的实战示例,展示了如何在HTML页面中动态显示查询结果。该示例使用XMLHttpRequest建立数据库连接,发送查询并处理响应,从而将数据填充到页面元素中,实现了HTML读取数据库的功能。

SPARKLE 撼与推出英特尔锐炫 Arc 嵌入式显卡,提供最长 5 年支持服务 SPARKLE 撼与推出英特尔锐炫 Arc 嵌入式显卡,提供最长 5 年支持服务 Apr 22, 2024 am 11:52 AM

本站4月22日消息,SPARKLE撼与科技宣布推出英特尔锐炫Arc嵌入式显卡,包含PCIe版的A310E、A380E及MXM版的A350E、A370E显卡,承诺最长5年支持服务。SPARKLE英特尔锐炫ArcA380E显卡IA30GC-TN4E该显卡TBP(本站注:TotalBoardPower)为75W,采用双槽单风扇设计、6GBGDDR6显存,提供1个HDMI与3个DisplayPort接口,5年支持服务。SPARKLE英特尔锐炫ArcA380E半高显卡IA30GBL-TN4E这款半高显卡T

在PHP中使用MySQLi建立数据库连接的详尽教程 在PHP中使用MySQLi建立数据库连接的详尽教程 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

如何在PHP中处理数据库连接错误 如何在PHP中处理数据库连接错误 Jun 05, 2024 pm 02:16 PM

PHP中处理数据库连接报错,可以使用以下步骤:使用mysqli_connect_errno()获取错误代码。使用mysqli_connect_error()获取错误消息。通过捕获并记录这些错误信息,可以轻松识别并解决数据库连接问题,确保应用程序的顺畅运行。

Arduino 回应嵌入式系统 Mbed 终止支持影响:已找到替代方案,年底前发布首个测试版 Arduino 回应嵌入式系统 Mbed 终止支持影响:已找到替代方案,年底前发布首个测试版 Jul 26, 2024 am 11:32 AM

本站7月26日消息,Arm公司于7月9日发布公告,宣布将于2026年7月终止支持开源嵌入式操作系统MbedOS,后续不再继续维护,届时Mbed网站将被存档,并且将无法通过在线工具构建项目。这则消息在嵌入式开发社区引起广泛讨论,影响Arm支持的项目(如micro:bit、Arduino和RaspberryPi)。Arduino公司于7月24日发布博文,表示几年前就开始寻找替代解决方案,因此于2023年加入Zephyr项目,并成为该项目银牌成员,并在ZephyrOS中找到了一个很好的替代品。Ardu

安提国际 Aetina 推出锐炫 Arc A380E 嵌入式显卡:单槽半高设计、50W 功耗 安提国际 Aetina 推出锐炫 Arc A380E 嵌入式显卡:单槽半高设计、50W 功耗 Apr 26, 2024 am 08:04 AM

本站4月25日消息,AIoT设备厂商安提国际Aetina今日推出单槽半高设计的英特尔锐炫ArcA380E嵌入式显卡,型号为IA380E-QUFL,提供五年产品长期供货承诺。这款显卡采用英特尔ArcA380E核心,具有8个Xe核心与128个英特尔XMX核心,基础频率2000MHz、加速频率2250MHz,拥有4.096TFLOPS算力,支持硬件光线追踪;搭载96bit位宽的6GBGDDR6显存,适用于边缘视觉计算及人工智能推理。该显卡采用半高单槽设计,功耗仅50W,可直接从PCIe插槽取电,无需外

See all articles