Berkeley DB——Database
Berkeley DB——Database
Development Environment
Windows XP Profession,Visual Studio C++ 2005
Concept
1、 Berkeley DB是嵌入式数据库系统,支持几乎所有的现代操作系统。
2、 由一个个文件组成,文件名为XXX.DB,一个文件中可以含有一个到多个DB。
3、 Berkeley DB不支持SQL、存储过程和触发器等关系数据库的高级特性。
4、 Database(DBT)就相同于关系数据库中的Table,它的key/data 对就相当于关系数据表的主键和其它n-1列,因为你可以在data中存入任意类型的数据,比如一个结构体。
5、 游标(Cursor,DBC),就是一个关于特定记录的遍历器,在处理多重记录(duplicate record,多条记录key相同,而data不同)时使用它尤为方便,且效率高(称为bulk get,一次获取一批记录)。
6、 数据库环境(DB_ENV),为Berkeley DB的高级特性,就是多个Database的包装器,它提供诸如日志恢复、多线程、事务处理和高性能支持等服务。
7、 数据访问算法(Database Access Method)——数据在硬盘上存储和操作的方法。Berkeley DB支持B+树、Hash、Recno和Queue算法。
Begin to Use Berkeley DB
添加Berkeley db的include目录为Application的include路径,添加其lib目录为Application的lib引用路径,这样将Berkeley DB的lib和我们的Application编译为一个程序,令其“嵌入”我们的程序中。
Choose Database Access Method
Access Method |
Description |
Choosing Occasion |
B+树 |
关键字有序存储,并且其结构能随数据的插入和删除进行动态调整。为了代码的简单,Berkeley DB没有实现对关键字的前缀码压缩。B+树支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构。 |
1、 当Key为复杂类型时。 2、 当Key有序时。 |
Hash |
DB中实际使用的是扩展线性HASH算法(extended linear hashing),可以根据HASH表的增长进行适当的调整。关键字可以为任意的数据结构。 |
1、 当Key为复杂类型。 2、 当数据较大且key随机分布时。 |
Recno |
要求每一个记录都有一个逻辑纪录号,逻辑纪录号由算法本身生成。相当于关系数据库中的自动增长字段。Recho建立在B+树算法之上,提供了一个存储有序数据的接口。记录的长度可以为定长或不定长。 |
1、 当key为逻辑记录号时。 2、 当非高并发的情况下。 |
Queue |
和Recno方式接近, 只不过记录的长度为定长。数据以定长记录方式存储在队列中,插入操作把记录插入到队列的尾部,相比之下插入速度是最快的。 |
1、 1、当key为逻辑记录号时。 2、 定长记录。 3、 高并发的情况下。 |
Open Database
使用Db.open来打开一个数据库。打开数据库有多种方式,常用的有:
Open Flag |
Description |
DB_CREATE |
如果数据库不存在,则创建之。 |
DB_EXCL |
如果数据库存在,则返回失败。只和DB_CREATE一起使用才有意义。 |
DB_RDONLY |
以只读的方式打开数据库。 |
代码示例:
#include <db_cxx.h> ... Db db(NULL, 0); // Instantiate the Db object u_int32_t oFlags = DB_CREATE; // Open flags; try { // Open the database db.open(NULL, // Transaction pointer "my_db.db", // Database file name NULL, // Optional logical database name DB_BTREE, // Database access method oFlags, // Open flags 0); // File mode (using defaults) // DbException is not subclassed from std::exception, so // need to catch both of these. } catch(DbException &e) { // Error handling code goes here } catch(std::exception &e) { // Error handling code goes here } |
如果需要使用Berkeley DB的高级功能,可以在DbEnv(环境)中打开Database:
#include <db_cxx.h> ... u_int32_t env_flags = DB_CREATE; // If the environment does not // exist, create it. u_int32_t db_flags = DB_CREATE; // If the database does not // exist, create it. std::string envHome("/export1/testEnv"); std::string dbName("mydb.db"); DbEnv myEnv(0); Db *myDb; try { myEnv.open(envHome.c_str(), env_flags, 0); myDb = new Db(&myEnv, 0); myDb->open(NULL, dbName.c_str(), NULL, DB_BTREE, db_flags, 0); } catch(DbException &e) { std::cerr << "Error opening database environment: " << envHome << " and database " << dbName << std::endl; std::cerr << e.what() << std::endl; exit( -1 ); } catch(std::exception &e) { std::cerr << "Error opening database environment: " << envHome << " and database " << dbName << std::endl; std::cerr << e.what() << std::endl; exit( -1 ); } |
Close Database
关闭数据库很简单,只需要使用Db.close(0)来关闭db:
#include <db_cxx.h> ... Db db(NULL, 0); // Database open and access operations happen here. try { // Close the database db.close(0); // DbException is not subclassed from std::exception, so // need to catch both of these. } catch(DbException &e) { // Error handling code goes here } catch(std::exception &e) { // Error handling code goes here } |
当在DbEnv中打开数据库时,关闭此DbEnv中的所有的Db后,必须关闭此DbEnv:
try { if (myDb != NULL) { myDb->close(0); } myEnv.close(0); } catch(DbException &e) { std::cerr << "Error closing database environment: " << envHome << " or database " << dbName << std::endl; std::cerr << e.what() << std::endl; exit( -1 ); } catch(std::exception &e) { std::cerr << "Error closing database environment: " << envHome << " or database " << dbName << std::endl; std::cerr << e.what() << std::endl; exit( -1 ); } |
在操作数据(添加、修改和删除数据)时,都是在内存中进行的,并没有写到磁盘中,而只有当我们调用Db.close(0)方法后,才将内存中的数据写入磁盘中。如果不想关闭数据库而又想把数据写入磁盘的话,可以调用Db.sync(0)方法,及时将数据写入磁盘可以降低发生DB crash而导致数据丢失的危险的几率。
Reference
嵌入式数据库系统Berkeley DB
Berkeley DB Ref Doc
所有Berkeley DB相关的随笔
Berkeley DB——Database相关推荐
- Java那些事之Berkeley DB
最近一直在使用java,随着使用时间的加长,对java也有了更深入的了解.从今天开始,我会写一些关于java的专题内容,希望大家喜欢,也希望各位多多讨论指正. 这一次先介绍一下Berkeley DB的 ...
- Berkeley DB——Records
Berkeley DB--Records 本文主要讲述如何操作Berkeley DB的记录--Records的Create.Retrieve.Update和Delete. Key/Data Pair ...
- Berkeley DB基础教程
一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...
- berkeley db java edition 源码,Berkeley DB Java Edition
本来想写一篇,发现网上有一篇已经写的很好了,所以稍微加一些介绍,其他部分尤其是去看它的吧.附带自己写的一个connection 代码. 简介 Berkeley DB(BDB)是一个高性能的,嵌入式键值 ...
- Berkeley DB Java Edition
一. 简介Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据.l 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不 ...
- 新浪研发中心: Berkeley DB 使用经验总结
http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...
- Berkeley DB(BDB)介绍
Berkeley DB是一个开放源代码的内嵌式数据库管理系统,能够为应用程序提供高性能的数据管理服务.应用它程序员只需要调用一些简单的API就可以完成对数据的访问和管理.与常用的数据库管理系统(如My ...
- Berkeley db 数据库
开发Berkeley DB原因: DB最初开发的目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现(如AT&T的dbm,Berkeley的ndbm,GNU项目的gdbm ...
- 嵌入式数据库BERKELEY DB 之dubbo实战
berkeley db 时oracle旗下的一款嵌入式数据库...当然,在互联网业界,他并不火,但是它确实很省内存,,对于一些想要替换redis的解决方案--可以考虑..想要学习它.甚至在一些主流的网 ...
最新文章
- 开发自己的框架——(二)数据库工具类的封装
- DM工作笔记-查看会话(session)信息与关闭会话
- CVPR 2020 Oral|效果超群的老照片“复活”算法
- js返回页面并刷新页面数据
- 解决eclipse 端口被占用问题
- python黑帽子编程实现没网流量抓包和统计_《Python黑帽子》python3代码实现(第三章)...
- 安装SqlServer 2016 2017 时,提示需要安装oracle JRE7 更新 51(64位)或更高版本
- php 结巴分词,将开源PHP组件注册为服务提供者,以结巴分词为例
- Python的应用场景和市场需求
- html5 canvas 图片移动端,支持移动端的HTML5 Canvas逼真黑板特效
- 移动周刊第 188 期:Android 安全性要点与规范核心详析
- 65款实用Chrome插件推荐
- 【翻译】Chrome Developer Tools: Element 样式
- 大数据平台的使用(Hadoop 生态圈、CDH)
- cortana android 地图,Here地图停止适配Win10系统 微软:那我自己干
- 无线键盘有几种连接方式?(USB接收器连接(无线2.4g)、蓝牙连接、wi-fi连接、红外线连接)
- html css雪花动画效果,css3动画雪花特效
- JavaScript实现3秒后跳转页面
- maven项目的部署开发
- win7开机黑屏开计算机无桌面图标任务栏
热门文章
- java c 效率_吐槽一下java的效率。。。比起C差的真的好远。。。
- 计算机上能玩vr游戏吗,VR设备是什么? 听说可以用来玩电脑游戏的?
- ue4加载本地版本_【虚幻4】创建本地数据库
- Java基础:成员变量的继承与覆盖
- 公布获奖名单推文文案_国学养正·趣味竞答获奖名单公布啦
- 吞吐量达到瓶颈后下降_如何找到 Kafka 集群的吞吐量极限?
- python判断sqlite连接状态_python3 自动识别usb连接状态,即对usb重连的判断方法
- linux 之 rpm 网站
- 实现人脸识别性别之路---open CV将图片显示出来
- 【原创】如何使用Jmockit进行单元测试