- 浏览: 1998995 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
1. Berkeley DB的简介
Berkeley DB(BDB)是一个高性能的嵌入式数据库编程库(引擎),它可以用来保存任意类型的键/值对 (Key/Value Pair),而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据。
BDB提供诸如C语言,C++,Java,Perl,Python,Tcl等多种编程语言的API,并且广泛支持大多数类Unix操作系统和Windows操作系统以及实时操作系统(如 VxWorks)。
1991年,Berkeley DB的第一个版发行(Linux系统也在这一年诞生),其最初的开发目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现,该版本还包含了B+树数据访问算法。
1992年,BSD UNIX第4.4发行版中包含了Berkeley DB1.85版。基本上认为这是Berkeley DB的第一个正式版。
1996年,Sleepycat软件公司成立,提供对Berkeley DB的商业支持。
2006年,Sleepycat被Oracle收购,当时最新版本是4.7.25。
2. 直观了解Berkeley DB软件包
Berkeley DB是一款开源软件,我们可以从Oracle的官方网站得到其源代码包。其源代码目录是由一系列子目录组成,从BDB的实现角度按照功能层次可将它们简单归类,划分如下:
a. DB核心模块(db);
b. 各子系统模块(存储管理子系统:btree/hash/qam;内存池管理子系统:mp;事务子系统:txn;锁子系统:mutex;日志子系统:log);
c. 操作系统抽象层(os_brew/os_s60/os_windows等);
d. Build目录(build_brew/build_s60/build_windows等);
e. 工具程序(db_archive/db_checkpoint等);
f. 语言API支持;
g. 例子(examples_c/examples_csharp等);
h. 其它;
通过源代码编译安装BDB很简单,代码如下:
cd ./db-4.8.30/build_unix
../disk/configure --prefix=<dir>
make && make install
安装目标目录(/usr/local/BerkeleyDB.4.8)包含四个子目录:
A. bin 一些实用工具
B. docs 文档
C. include 包含了使用BDB库开发程序时的头文件
D. lib 包含了使用BDB库开发程序时需要连接的库文件
3. 如何获得BDB的相关知识
BDB提供里非常详细的文档,可以官方网站获得html或pdf版本的文档。这里对pdf版本的一些文档简介如下:
BDB_Installation.pdf: BDB的安装文档,涵盖了不同操作系统,不同的编译工具,不同编程语言等多方面的详细信息;
BDB_Prog_Reference.pdf: 该文档是使用BDB的开发人员的参考手册,主要从BDB的各种功能和机制的原理进行阐述,供使用BDB作为存储引擎来编写程序的各类程序员(C、Java、C#、Perl)阅读;
BDB-Porting-Guide.pdf: 该文档是给需要将BDB移植到一个新的平台开发人员准备的;
InMemoryDBApplication.pdf: 基于内存的BDB应用的相关知识;
BDB-C_APIReference.pdf: C API参考手册,跟BDB_Prog_Reference.pdf结合使用;
BerkeleyDB-Core-C-GSG.pdf: 为C语言开发人员提供的BDB的入门手册;
BerkeleyDB-Core-C-Txn.pdf: 为C语言开发人员提供的BDB事务方面的手册;
Replication-C-GSG.pdf: 为C语言开发人员提供的BDB复制方面的手册;
4. 以上对源码目录的分类是从实现角度按照层次进行划分的,如果从BDB的功能模块,或者说是从系统结构角度进行划分,可将其分为几个子系统:
存储管理子系统 (Storage Subsystem)
内存池管理子系统 (Memory Pool Subsystem)
事务子系统 (Transaction Subsystem)
锁子系统 (Locking Subsystem)
日志子系统 (Logging Subsystem)
5. 以上的五个子系统完成了BDB作为一个Database所需要的大部分功能,如何驾驭以上子系统来完成我们需要的任务是关键。像MySQL这种独立的RDBMS,我们可以通过配置和SQL语句来控制和使用它的各种功能。由于BDB是一个嵌入式的数据库,最终还是需要程序员通过调用API来完成。所以要使用好BDB,需要先了解其原理,然后在合适的位置上调用合适的API。
写一个BDB程序的一般步骤:
a. 创建、设置和打开Environment;b. 创建、设置和打开Database;c. 访问Database;d.关闭Database;e. 关闭Environment。
此处的Database是从属于Environment,即db是在env这个环境上面建立起来的。为了便于快速把握重点,可以用BDB跟一般的RDBMS做个类比,这里的Database相当于数据表,Environment相当于数据库。
DB_ENV *dbenv;
DB *dbp;
int ret;
if ((ret = db_env_create(&dbenv, 0)) != 0) {
fprintf(errfp, "%s: %s\n", progname, db_strerror(ret));
return (1);
}
dbenv->set_errfile(dbenv, errfp);
dbenv->set_errpfx(dbenv, progname);
if ((ret = dbenv->set_cachesize(dbenv, 0, 64 * 1024, 0)) != 0) {
dbenv->err(dbenv, ret, "set_cachesize");
dbenv->close(dbenv, 0);
return (1);
}
(void)dbenv->set_data_dir(dbenv, data_dir);
if ((ret = dbenv->open(dbenv, home, DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN, 0644)) != 0) {
dbenv->err(dbenv, ret, "environment open: %s", home);
dbenv->close(dbenv, 0);
return (1);
}
if ((ret = db_create(&dbp, dbenv, 0)) != 0){
fprintf(errfp, "%s: %s\n", progname, db_strerror(ret));
return (1);
}
if ((ret = dbp->open(dbp, NULL, "exenv_db1.db", NULL, DB_BTREE, DB_CREATE,0644)) != 0){
fprintf(stderr, "database open: %s\n", db_strerror(ret));
return (1);
}
if ((ret = dbp->close(dbp, 0)) != 0) {
fprintf(stderr, "database close: %s\n", db_strerror(ret));
return (1);
}
if ((ret = dbenv->close(dbenv, 0)) != 0) {
fprintf(stderr, "DB_ENV->close: %s\n", db_strerror(ret));
return (1);
}
return (0);
数据文件:
一个BDB的实例会产生数据存储文件,数据文件的目录由dbenv->set_data_dir(dbenv, data_dir);这条语句来指定。涉及的文件类型有:Data Files,Log Files,Region Files,Temporary Files。
Data Files:数据文件,存储实际的数据;
Log Files:日志文件;
Region Files:是各个子系统保存信息的文件,如果在Env中设置了DB_PRIVATE选项,这些信息是被一个进程私有,即它们保存在内存中,这些文件在此种情况下不产生;
Temporary Files: 临时文件,特使情况会被创建;
数据的存数格式:
Berkeley DB提供了以下四种文件存储方法:哈希文件、B树、定长记录(队列)和变长记录(基于记录号的简单存储方式),应用程序可以从中选择最适合的文件组织结构。以上代码通过db->open函数中设置了DB_BTREE这个选项指定其使用B树方式存储。其它的三种存储格式对应的类型为:DB_HASH,DB_QUEUE,DB_RECNO。
事务提交:
BDB中的事务提交有两种方式:DB_AUTO_COMMIT和显式提交事务。如果设置为DB_AUTO_COMMIT,则每步操作多作为单独的事务自动提交;如果需要显示提交,则需要显示调用具体事务相关的begin/end API(相见文档BerkeleyDB-Core-C-Txn.pdf)。
BDB在事务提交时也是遵循先写日志并刷新到磁盘的方式,但是为了提高性能,其又引入了两个选项:DB_TXN_NOSYNC和DB_TXN_WRITE_NOSYNC。DB_TXN_NOSYNC的作用是使BDB在事务提交的时候不严格要求日志到磁盘,刷新与否取决于日志缓冲;DB_TXN_WRITE_NOSYNC会比DB_TXN_NOSYNC稍显严格,其含义是要求事务提交刷新日志,但只是刷到操作系统文件缓存当中。
BDB的事务隔离性级别有三个:READ UNCOMMITED、READ COMMITED、SERIALIZABLE
CheckPoint:
执行一个检查点会完成的工作有:Flushes all dirty pages from the in-memory cache to database files;Writes a checkpoint record;Flushes the log to log files;Writes a list of open databases.
调用API DB_ENV->txn_checkpoint(); 即可完成,如果是非DB_PRIVATE的Env,也可以使用BDB自带的工具db_checkpoint。为了避免出现一个检查点提交大量数据的情况,BDB还提供了轻量级刷新脏页的API:DB_ENV->memp_trickle();
Replication:
BDB中提供了两种方式来支持复制技术:Replication Base API和Replication Manager。可以说Replication Base API是最基础的API,实现方式灵活,功能强大,但是编码量大;Replication Manager相当于框架,使用方式简单,编码量小。Replication Manager可能能够满足大部分用户的需求,但不是所有需求,所以灵活性不足。如果您的需要是Replication Manager不能满足的,请使用Replication Base API自己实现复制策略。Replication Manager的主从策略有两种:指定主从、自动推举主从。
分区:
BDB的分区机制是从db-4.8.x之后刚引入的新功能,涉及到的API有两个:
DB->set_partition() 设置分区方式,包含了一个分区方式的回调函数,用户可以通过编写代码来自己实现分区方式,非常灵活。(详见API手册BDB-C_APIReference.pdf)
DB->set_partition_dirs() 设置分区目录。(详见API手册BDB-C_APIReference.pdf)
备份:
BDB有三种备份方式:
Offline Backups:离线备份,停服务拷贝数据目录;
Hot Backups:使用API或者BDB自带工具db_backup在DB在使用情况做备份;
Incremental Backups:增量备份;
具体细节详见BerkeleyDB-Core-C-Txn.pdf。
6. 以下是可能获取到Berkeley DB资源的链接:
官方主页:
http://www.oracle.com/database/berkeley-db/db/index.html
产品下载:
http://www.oracle.com/technology/software/products/berkeley-db/index.html
官方开发者文档中心:
http://www.oracle.com/technology/documentation/berkeley-db/db/index.html
发表评论
-
多机器执行ssh脚本
2012-08-30 18:12 2177#!/bin/bash Usage() { ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1471前言 UNIX/LINUX平台下的数据库种类非常多 ... -
C语言中标准输入流、标准输出流、标准错误输出流
2011-06-13 14:32 9197C语言中标准输入流、标准输出流、标准错误输出流 在 ... -
mysql给用户赋予权限
2011-05-20 17:35 1113grant all on *.* to 'apsara' ... -
Rsync 实现原理
2011-05-12 20:06 8250Rsync 实现原理 前言 关于rsync的原始文档 ... -
shell中双引号的误用
2011-05-12 15:02 1125for i in "$LIST" ... -
c++简单的虚函数测试
2011-04-27 14:25 967#include <iostream> u ... -
C++文件行查找
2011-04-26 14:10 1350#include <iostream> # ... -
c++偏特化简单示例
2011-04-13 11:17 2106c++偏特化 // temp1.c ... -
shell for循环
2011-04-06 15:36 904for i in "1 2 3";do e ... -
GDB调试精粹及使用实例
2011-03-16 14:06 1079GDB调试精粹及使用实例 一:列文件清单 1. ... -
shell技巧 除法
2011-03-07 11:34 19126shell计算中使用除法,基本默认上都是整除。 比如: ... -
.bash_profile 文件修改之后不执行
2011-02-16 11:21 1873重新登录 不可能不好用的 除非你是从一个用户su oralc ... -
简单的ini文件解析
2011-02-12 16:36 1570int GetKeyVal(const string s ... -
SecureCRT中文显示乱码的解决方法
2011-02-12 11:38 1292最近开始用SecureCRT登陆linux系统,由于是新手,很 ... -
让putty显示中文
2011-02-11 14:43 1374对于经常在windows下远程ssh到linux的用户而言,p ... -
scanf族函数高级用法
2011-01-25 16:00 2480如何解释 fscanf(fd,&quo ... -
使用scons替代makefile(1)
2011-01-25 11:58 3638早在多年前我刚开始接触linux下的C程序时,经常被makef ... -
使用scons替代makefile(2)
2011-01-25 11:57 3525本篇文章接着上一篇进一步介绍scons的使用方法,主要介绍静态 ... -
使用scons替代makefile(3)
2011-01-25 11:55 4773在上两篇文章中已经简单介绍了用scons编译库文件,可执行程序 ...
相关推荐
berkeley db 使用手册
Berkeley db使用方法简介(c接口) 非SQL的高速内存数据库的使用方法,简单明了..
Berkeley DB4.8以上各版本,已经亲测过哪些版本可与redhat6.5兼容,见附件名称备注。
嵌入式数据库Berkeley DB Java Edition Berkeley DB的使用 使用Berkeley DB的一般步骤 创建、打开、操作、关闭数据库环境Environment
Oracle Berkeley DB Java 版是一个开源的、可嵌入的事务存储引擎,是完全用 Java 编写的。与 Oracle Berkeley DB 类似,Oracle Berkeley DB Java 版在应用程序的地址空间中执行,没有客户端/服务器通信的开销,从而...
Berkeley DB 6.2.32_64.msi Windows 64-bit binary installer Berkeley DB是一个嵌入式数据库,为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。 主要特点: 嵌入式:直接链接到应用程序中,与...
Berkeley DB(BDB)是OpenLDAP后台数据库的默认配置,因此在安装OpenLDAP之前应先安装BDB。
BerkeleyDB测试程序 包含散列文件入库,和读取的速度的测试
Berkeley DB文章集合
Berkeley DB 5.3.21.tar,你也可以去http://www.oracle.com/technetwork/products/berkeleydb/downloads/index.html下载最新版
BerkeleyDB的java应用jar包
Berkeley DB6.0.20 Berkeley DB BDB Berkeley DB数据库
介绍DB API的设置与使用的快速入门手册,目标是提供一个快速有效地机制,能让你进入Berkeley DB研发的世界。在本文中侧重于C++语言的研发人员,以及研究进城内数据管理解决方案的资深架构师。
Oracle BerkeleyDB-JE je-6.0.11
本文描述了如何在Berkeley DB中使用事务(Transaction)。它简要介绍了事务是如何保护你的应用的数据的...本书假设你已经了解BerkeleyDB的基本架构知识(这些知识在<Getting Started with Berkeley DB Guide>一书中。)
sqlite 和Berkeley db各方面 的比较
Java版本的Berkeley DB用户手册,找了好久
BerkeleyDB和Sqlite是当前最流行的嵌入式开源数据库。
Berkeley DB 批量插入更新与删除用法示例 Berkeley 函数接口 Berkeley DB 由浅入深 SQL 开发人员 Oracle Berkeley DB 指南 Berkeley DB参考手册