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相关推荐

  1. Java那些事之Berkeley DB

    最近一直在使用java,随着使用时间的加长,对java也有了更深入的了解.从今天开始,我会写一些关于java的专题内容,希望大家喜欢,也希望各位多多讨论指正. 这一次先介绍一下Berkeley DB的 ...

  2. Berkeley DB——Records

    Berkeley DB--Records 本文主要讲述如何操作Berkeley DB的记录--Records的Create.Retrieve.Update和Delete. Key/Data Pair ...

  3. Berkeley DB基础教程

    一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...

  4. berkeley db java edition 源码,Berkeley DB Java Edition

    本来想写一篇,发现网上有一篇已经写的很好了,所以稍微加一些介绍,其他部分尤其是去看它的吧.附带自己写的一个connection 代码. 简介 Berkeley DB(BDB)是一个高性能的,嵌入式键值 ...

  5. Berkeley DB Java Edition

    一. 简介Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据.l 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不 ...

  6. 新浪研发中心: Berkeley DB 使用经验总结

    http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...

  7. Berkeley DB(BDB)介绍

    Berkeley DB是一个开放源代码的内嵌式数据库管理系统,能够为应用程序提供高性能的数据管理服务.应用它程序员只需要调用一些简单的API就可以完成对数据的访问和管理.与常用的数据库管理系统(如My ...

  8. Berkeley db 数据库

    开发Berkeley DB原因: DB最初开发的目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现(如AT&T的dbm,Berkeley的ndbm,GNU项目的gdbm ...

  9. 嵌入式数据库BERKELEY DB 之dubbo实战

    berkeley db 时oracle旗下的一款嵌入式数据库...当然,在互联网业界,他并不火,但是它确实很省内存,,对于一些想要替换redis的解决方案--可以考虑..想要学习它.甚至在一些主流的网 ...

最新文章

  1. 开发自己的框架——(二)数据库工具类的封装
  2. DM工作笔记-查看会话(session)信息与关闭会话
  3. CVPR 2020 Oral|效果超群的老照片“复活”算法
  4. js返回页面并刷新页面数据
  5. 解决eclipse 端口被占用问题
  6. python黑帽子编程实现没网流量抓包和统计_《Python黑帽子》python3代码实现(第三章)...
  7. 安装SqlServer 2016 2017 时,提示需要安装oracle JRE7 更新 51(64位)或更高版本
  8. php 结巴分词,将开源PHP组件注册为服务提供者,以结巴分词为例
  9. Python的应用场景和市场需求
  10. html5 canvas 图片移动端,支持移动端的HTML5 Canvas逼真黑板特效
  11. 移动周刊第 188 期:Android 安全性要点与规范核心详析
  12. 65款实用Chrome插件推荐
  13. 【翻译】Chrome Developer Tools: Element 样式
  14. 大数据平台的使用(Hadoop 生态圈、CDH)
  15. cortana android 地图,Here地图停止适配Win10系统 微软:那我自己干
  16. 无线键盘有几种连接方式?(USB接收器连接(无线2.4g)、蓝牙连接、wi-fi连接、红外线连接)
  17. html css雪花动画效果,css3动画雪花特效
  18. JavaScript实现3秒后跳转页面
  19. maven项目的部署开发
  20. win7开机黑屏开计算机无桌面图标任务栏

热门文章

  1. java c 效率_吐槽一下java的效率。。。比起C差的真的好远。。。
  2. 计算机上能玩vr游戏吗,VR设备是什么? 听说可以用来玩电脑游戏的?
  3. ue4加载本地版本_【虚幻4】创建本地数据库
  4. Java基础:成员变量的继承与覆盖
  5. 公布获奖名单推文文案_国学养正·趣味竞答获奖名单公布啦
  6. 吞吐量达到瓶颈后下降_如何找到 Kafka 集群的吞吐量极限?
  7. python判断sqlite连接状态_python3 自动识别usb连接状态,即对usb重连的判断方法
  8. linux 之 rpm 网站
  9. 实现人脸识别性别之路---open CV将图片显示出来
  10. 【原创】如何使用Jmockit进行单元测试