- 浏览: 2031025 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 2234#!/bin/bash Usage() { ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1526前言 UNIX/LINUX平台下的数据库种类非常多 ... -
C语言中标准输入流、标准输出流、标准错误输出流
2011-06-13 14:32 9277C语言中标准输入流、标准输出流、标准错误输出流 在 ... -
mysql给用户赋予权限
2011-05-20 17:35 1209grant all on *.* to 'apsara' ... -
Rsync 实现原理
2011-05-12 20:06 8313Rsync 实现原理 前言 关于rsync的原始文档 ... -
shell中双引号的误用
2011-05-12 15:02 1177for i in "$LIST" ... -
c++简单的虚函数测试
2011-04-27 14:25 1012#include <iostream> u ... -
C++文件行查找
2011-04-26 14:10 1399#include <iostream> # ... -
c++偏特化简单示例
2011-04-13 11:17 2151c++偏特化 // temp1.c ... -
shell for循环
2011-04-06 15:36 973for i in "1 2 3";do e ... -
GDB调试精粹及使用实例
2011-03-16 14:06 1133GDB调试精粹及使用实例 一:列文件清单 1. ... -
shell技巧 除法
2011-03-07 11:34 19174shell计算中使用除法,基本默认上都是整除。 比如: ... -
.bash_profile 文件修改之后不执行
2011-02-16 11:21 1934重新登录 不可能不好用的 除非你是从一个用户su oralc ... -
简单的ini文件解析
2011-02-12 16:36 1611int GetKeyVal(const string s ... -
SecureCRT中文显示乱码的解决方法
2011-02-12 11:38 1339最近开始用SecureCRT登陆linux系统,由于是新手,很 ... -
让putty显示中文
2011-02-11 14:43 1419对于经常在windows下远程ssh到linux的用户而言,p ... -
scanf族函数高级用法
2011-01-25 16:00 2549如何解释 fscanf(fd,&quo ... -
使用scons替代makefile(1)
2011-01-25 11:58 3721早在多年前我刚开始接触linux下的C程序时,经常被makef ... -
使用scons替代makefile(2)
2011-01-25 11:57 3574本篇文章接着上一篇进一步介绍scons的使用方法,主要介绍静态 ... -
使用scons替代makefile(3)
2011-01-25 11:55 4816在上两篇文章中已经简单介绍了用scons编译库文件,可执行程序 ...
相关推荐
### Berkeley DB 应用知识点详解 #### 一、Berkeley DB 概述 Berkeley DB(简称 BDB)是一款开源的嵌入式数据库...在学习和使用 Berkeley DB 的过程中,建议结合实际项目需求进行实践,不断积累经验,提升技术水平。
Oracle虽然主要以二进制形式提供,但开源的Oracle分支如OpenJDK和Berkeley DB等可以帮助开发者了解其底层运作。 另一个标签“工具”则涵盖了Oracle提供的多种开发和管理工具,例如SQL Developer(用于编写SQL查询)...
2. 库文件:如 OpenSSL 用于安全通信,Berkeley DB 用于存储管理等。 3. 开发头文件:与 Tuxedo 相关的库的头文件,用于编译和链接。 4. 系统工具:如 grep、find、sed 等用于系统操作和文件处理。 【文件名称列表...
slapd可以配置为支持多种后端存储选项,包括BDB(Berkeley DB)、HDB(Hashed Database)等。 #### 二、OpenLDAP快速入门指南 **2.1 快速入门** 本节将指导您快速设置和配置OpenLDAP环境。首先,需要获取OpenLDAP...
- **Berkeley DB**:由Oracle开发的数据管理系统。 - **bzip2/libbzip2**:由Julian R. Seward开发的压缩库。 - **OpenSSL Toolkit**:由OpenSSL项目团队开发的安全套接层工具包。 - **SSLeay**:由Eric Young开发的...
假设要添加名为`hwadee.db`的自定义区域文件,其实际存储位置为`/var/named/chroot/etc`,但在配置文件中应使用`/etc/hwadee.db`作为路径,这是因为BIND在运行时会切换到指定的工作目录。 ``` zone "example.com" {...
- **IPv6**: 使用128位二进制表示,分为八个十六位字节,如`2001:0db8:85a3:0000:0000:8a2e:0370:7334`。 ##### 2.2 常见服务 网络上有很多常用的服务,包括但不限于: - **HTTP (超文本传输协议)**: 用于网页传输...
- 构建分布式缓存雏形,基于Berkeley DB。 ##### V2.2 (2006.10-2007.12) - **技术创新**:从使用现有技术转向自主研发。 - **新技术应用**: - 建立类目属性体系。 - 分布式存储TFS。 - 分布式缓存Tair。 - ...
- 引入了支持分库的数据访问框架,并实现了基于Berkeley DB的缓存系统。 - **2006-2007年**:引入分布式文件系统和缓存,升级搜索引擎。 - 分布式文件系统类似于Google File System (GFS),支持数据紧缩与去重。 ...
课程的主要目标是让学生了解操作系统(OS)和数据库(DB)领域的最新进展,并通过实践项目加深对这些技术的理解。 ##### 1.2 讲师简介 - **Eric Brewer**: - 获得麻省理工学院(MIT)博士学位(1994年)。 - ...
- **中期后期**(2004.10-2007.01):为了进一步提升系统的稳定性和性能,淘宝开始采用JBOSS作为容器,并引入Spring框架,以及基于Berkeley DB的缓存技术。 - **特点**:容器替换,引入Spring框架优化代码结构。 -...