Berkeley DB (DB)介绍
Berkeley DB (DB)是一个高性能的,嵌入数 据库编程库,和C语言,C++,Java,Perl,Python,PHP,Tcl以及其他很多语言都有绑定。Berkeley DB可以保存任意类型的键/值对,而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据,广泛用于各种操作系统包括大多数Unix类操作系统和Windows操作系统以及 实时操作系统。
2.0版本或以上的Berkeley DB由Sleepycat Software公司开发,并使用基于自由软件许可协议/私有许可协议的双重授权方式提供[1],附有源代码。开发者如果想把Berkeley DB嵌入在私有软件内需要得到Sleepycat公司的许可,若将软件同样遵循GPL发布,则不需许可即可使用。而2.0版本以下的则使用BSD授权,可 自由作商业用途。 Berkeley DB最初开发的目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现(如AT&T的dbm,Berkeley的 ndbm,GNU项目的gdbm),Berkeley DB的第一个发行版在1991年出现,当时还包含了B+树数据访问算法。在1992年,BSD UNIX第4.4发行版中包含了Berkeley DB1.85版。基本上认为这是Berkeley DB的第一个正式版。在1996年中期,Sleepycat软件公司成立,提供对Berkeley DB的商业支持。在这以后,Berkeley DB得到了广泛的应用,当前最新版本是4.3.27。 值得注意的是DB是嵌入式数据库系统,而不是常见的关系/对象型数据库,对SQL语言不支持,也不提供数据库常见的高级功能,如存储过程,触发器等。 Berkeley DB的体系结构 Berkeley DB以拥有比Microsoft SQL Server和Oracle等数据库系统而言更简单的体系结构而著称。例如,它不支持网络访问—程序通过进程内的API访问数据库。 他不支持SQL或者其他的数据库查询语言,不支持表结构和数据列。 访问数据库的程序自主决定数据如何储存在记录里,Berkeley DB不对记录里的数据进行任何包装。记录和它的键都可以达到4G字节的长度。 Berkeley DB的核心数据结构 数据库句柄结构DB:包含了若干描述数据库属性的参数,如数据库访问方法类型、逻辑页面大小、数 据库名称等;同时,DB结构中包含了大量的数据库处理函数指针,大多数形式为 (*dosomething)(DB *, arg1, arg2, …)。其中最重要的有open,close,put,get等函数。 Berkeley DB数据访问算法 在数据库领域中,数据访问算法对应了数据在硬盘上的存储格式和操作方法。在编写应用程序时,选择合适的算法可能会在运算速度上提高1个甚至多个数量级。大 多数数据库都选用B+树算法,DB也不例外,同时还支持HASH算法、Recno算法和Queue算法。接下来,我们将讨论这些算法的特点以及如何根据需 要存储数据的特点进行选择。 B+树算法 B+树是一个平衡树,关键字有序存储,并且其结构能随数据的插入和删除进行动态调整。为了代码的简单,DB没有实现对关键字的前缀码压缩。B+树支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构. HASH算法 DB中实际使用的是扩展线性HASH算法(extended linear hashing),可以根据HASH表的增长进行适当的调整。关键字可以为任意的数据结构。 要求每一个记录都有一个逻辑纪录号,逻辑纪录号由算法本身生成。实际上,这和关系型数据库中逻辑主键通常定义为int AUTO型是同一个概念。Recho建立在B+树算法之上,提供了一个存储有序数据的接口。记录的长度可以为定长或不定长。 和Recno方式接近, 只不过记录的长度为定长。数据以定长记录方式存储在队列中,插入操作把记录插入到队列的尾部,相比之下插入速度是最快的。 从DB的官方站点http://www.sleepycat.com/下载最新的软件包db-4.3.27.tar.gz,解压到工作目录,进入该目录,依次执行下列三条命令即可。 ../dist/configuremakemake install 执行make uninstall,则可卸载已安装的DB软件。 DB缺省把库和头文件安装在目录/usr/local/BerkeleyDB.4.3/下,使用gcc test.c -ggdb -I/usr/local/BerkeleyDB.4.3/include/ -L/usr/local/BerkeleyDB.4.3/lib/ -ldb -lpthread就可正确编译程序。如果读者的测试主机操作系统为RED HAT9,则安装的DB版本可能是4.0。特别要注意到这两个版本的库是不兼容的。例如打开数据库函数DB->open(),在4.0版本中入参为 6个,而在4.3版中则为7个(可自行比较两个库的头文件db.h中DB->open函数的定义)。因为在DB相关的应用程序中,open函数基本 上都是要执行的,所以如果函数和版本不匹配,编译肯定会出错。当然,编译完成后,可以使用命令ldd查看库的依赖关系。 DB常用函数使用范例#include <db.h> #include <stdio.h>#include <stdlib.h>#include <pthread.h> /* DB的函数执行完成后,返回0代表成功,否则失败 */void print_error(int ret){ if(ret != 0) printf("ERROR: %s/n",db_strerror(ret));} /* 数据结构DBT在使用前,应首先初始化,否则编译可通过但运行时报参数错误 */void init_DBT(DBT * key, DBT * data){ memset(key, 0, sizeof(DBT)); memset(data, 0, sizeof(DBT));} void main(void){ DB *dbp; DBT key, data; u_int32_t flags; int ret; char *fruit = "apple"; int number = 15; typedef struct customer { int c_id; char name[10]; char address[20]; int age; } CUSTOMER; CUSTOMER cust; int key_cust_c_id = 1; cust.c_id = 1; strncpy(cust.name, "javer", 9); strncpy(cust.address, "chengdu", 19); cust.age = 32; /* 首先创建数据库句柄 */ ret = db_create(&dbp, NULL, 0); print_error(ret); /* 创建数据库标志 */ flags = DB_CREATE; /* 创建一个名为single.db的数据库,使用B+树访问算法,本段代码演示对简单数据类型的处理 */ ret = dbp->open(dbp, NULL, "single.db", NULL, DB_BTREE, flags, 0); print_error(ret); init_DBT(&key, &data); /* 分别对关键字和数据赋值和规定长度 */ key.data = fruit; key.size = strlen(fruit) + 1; data.data = &number; data.size = sizeof(int); /* 把记录写入数据库中,不允许覆盖关键字相同的记录 */ ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE); print_error(ret); /* 手动把缓存中的数据刷新到硬盘文件中,实际上在关闭数据库时,数据会被自动刷新 */dbp->sync(); init_DBT(&key, &data); key.data = fruit; key.size = strlen(fruit) + 1; /* 从数据库中查询关键字为apple的记录 */ ret = dbp->get(dbp, NULL, &key, &data, 0); print_error(ret); /* 特别要注意数据结构DBT的字段data为void *型,所以在对data赋值和取值时,要做必要的类型转换。 */ printf("The number = %d/n", *(int*)(data.data)); if(dbp != NULL) dbp->close(dbp, 0); ret = db_create(&dbp, NULL, 0); print_error(ret); flags = DB_CREATE; /* 创建一个名为complex.db的数据库,使用HASH访问算法,本段代码演示对复杂数据结构的处理 */ ret = dbp->open(dbp, NULL, "complex.db", NULL, DB_HASH, flags, 0); print_error(ret); init_DBT(&key, &data); key.size = sizeof(int); key.data = &(cust.c_id); data.size = sizeof(CUSTOMER); data.data = &cust; ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE); print_error(ret); memset(&cust, 0, sizeof(CUSTOMER)); key.size = sizeof(int); key.data = &key_cust_c_id; data.data = &cust; data.ulen = sizeof(CUSTOMER); data.flags = DB_DBT_USERMEM; dbp->get(dbp, NULL, &key, &data, 0); print_error(ret); printf("c_id = %d name = %s address = %s age = %d/n", cust.c_id, cust.name, cust.address, cust.age); if(dbp != NULL) dbp->close(dbp, 0); }
[ 编辑]
DB游标使用范例游标是依赖于数据库句柄的,应用程序代码框架如下: /* 定义一个游标变量 */ DBC * cur; /* 首先打开数据库,再打开游标 */ dbp->open(dbp, ……); dbp->cursor(dbp, NULL, &cur, 0); /* do something with cursor */ /* 首先关闭,在关闭数据库 */ cur->c_close(cur); dbp->close(dbp, 0); 在游标打开后,可以以多种方式遍历特定记录。 Memset(&key, 0, sizeof(DBT)); Memset(&data, 0, sizeof(DBT)); /* 因为KEY和DATA为空,则游标遍历整个数据库记录 */ While((ret = cur->c_get(cur, &key, &data, DB_NEXT)) == 0) { /* do something with key and data */ } 当想查询特定关键字对应的记录,则应对关键字赋值,并把cur->c_get()函数中标志位设置为DB_SET。例如: key.data = "xxxxx"; key.size = XXX; While((ret = cur->c_get(cur, &key, &data, DB_SET)) == 0) { /* do something with key and data */ } 游标的作用还有很多,如查询多重记录,插入/修改/删除记录等。
[ 编辑]
DB环境使用范例环境是DB数据库的包装器,提供多种高级功能。应用程序代码框架如下: /* 定义一个环境变量,并创建 */ DB_ENV *dbenv; db_env_create(&dbenv, 0); /* 在环境打开之前,可调用形式为dbenv->set_XXX()的若干函数设置环境 */ /* 通知DB使用Rijndael加密算法(参考资料4)对数据进行处理 */dbenv->set_encrypt(dbenv, "encrypt_string", DB_ENCRYPT_AES); /* 设置DB的缓存为5M */dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0);/* 设置DB查找数据库文件的目录 */ dbenv->set_data_dir(dbenv, "/usr/javer/work_db"); /* 打开数据库环境,注意后四个标志分别指示DB启动日志、加锁、缓存、事务处理子系统 */ dbenv->open(dbenv,home,DB_CREATE|DB_INIT_LOG|DB_INIT_LOCK| DB_INIT_MPOOL|DB_INIT_TXN, 0); /* 在环境打开后,则可以打开若干个数据库,所有数据库的处理都在环境的控制和保护中。注意db_create函数的第二个参数是环境变量 */ db_create(&dbp1, dbenv, 0);dbp1->open(dbp1, ……); db_create(&dbp2, dbenv, 0);dbp1->open(dbp2, ……); /* do something with the database */ /* 最后首先关闭打开的数据库,再关闭环境 */ dbp2->close(dbp2, 0); dbp1->close(dbp1, 0); dbenv->close(dbenv, 0); |
参考资料:
1. http://wiki.ccw.com.cn/Berkeley_DB |
Berkeley DB (DB)介绍相关推荐
- Berkeley DB的介绍
Berkeley DB的介绍 Berkeley DB的访问方法有四种BTree.Hash.Queue.Recno 他们在DB创建时选择,而且只能在创建时选择.一点选定某一个访问方法, 在使用中不能改变 ...
- Berkeley DB DB数据库
1. 数据库 从概念上讲,Berkeley DB数据库是一个包含两列的表,其中第1列存放键值,第2列存放键值对应的数据.使用DBT类的实例(这个类的详细信息,请参阅数据库记录)键和数据管理.所以, ...
- wifi中2.4GHz、5GHz、db信道介绍
db标志着Wifi信号衰减,其强度以"-"开始."-"后的数值越小表示信号越高 [工作频段]将频率划分成多段,如2.4GHz频段(2.412GHz-2.484G ...
- 易优cms关于数据库Db::的介绍
Db::table('think_user') Db::name('user') db('user') table是数据库名称的全名,而name则是去除前缀! 第三个则是助手函数 三者使用方法一样 一 ...
- 关于无线网卡中的一个参数:DB的介绍
dB值代表信号强度, 当然大些好.在无线系统中,天线被用来把电流波转换成电磁波,在转换过程中还可以对发射和接收的信号进行"放 大",这种能量放大的度量成为"增益(Gain ...
- Mongo db 简单介绍及命令笔记
首先来了解下什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为W ...
- Berkeley DB介绍
简介: Berkeley DB是历史悠久的嵌入式数据库系统,主要应用在UNIX/LINUX操作系统上,其设计思想是简单.小巧.可靠.高性能.Berkeley DB (DB)是一个高性能 ...
- Berkeley DB基础教程
一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...
- 开源数据库:Berkeley DB和SQLite
下面介绍的是两个开放源代码的 嵌入式 数据库,Berkeley DB和SQLite.同时侧重介绍如何应用Java连接这两种嵌入式数据库. 一. Berkeley DB 1. 简介 Berke ...
最新文章
- mysql表级锁和行级锁
- CPU的核心数、线程数的关系和区别
- Spread for Windows Forms 7新功能使用指南
- python中index函数_详解python中的index函数用法
- 论文浅尝 | 面向多语言语义解析的神经网络框架
- angualr Material Icons
- DT大数据梦工厂 第55,56讲
- SNMPv3对安全威胁的分类
- [设计模式]装饰者模式
- 面试:用 Java 实现一个 Singleton 模式
- 超级好用论文写作工具NoteExpress下载和安装
- gps显示服务器离线,GPS离线的几大原因分析及解决方法
- MaskGAN:Towards Diverse and Interactive Facial Image Manipulation翻译
- stc12c5a60s 超声波HC-SR04测距
- Android Studio模拟器如何运行apk文件
- 写公众号一个月关注量破900,聊聊我的感受
- php调用shell执行scp,使用shell脚本自动执行scp文件传输
- 关于第一型曲面积分的再思考
- git_error:src refspec dev does not match any
- 点击input文本框,文字消失 JS
热门文章
- windows软件安全策略目录及类型
- django+haystack+elasticsearch优化查询效率
- 高云软件的在线逻辑分析仪使用教程
- 系统重装用户名与计算机名一致,笔记本重装系统后计算机名会自动改变吗?
- 外网链接内网:金万维端口映射、路由器设置
- html直角梯形div,css如何让div变成直角梯形
- 数字图像处理100问—23 直方图均衡化( Histogram Equalization )
- 估值百亿独角兽爱学习教育集团:通过云原生实践与时间赛跑
- pycharm调试FATE手册
- java线程cutdown_Java线程池实现原理与技术II