Berkeley DB

本文介绍了BerkeleyDB(BDB)的历史和发展,探讨了其作为高性能嵌入式数据库的特点和优势,包括支持多线程操作和事务处理等功能。此外,还提供了BerkeleyDB在C++环境下的编译安装指南及示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Berkeley DB的简介

Berkeley DBBDB)是一个高性能的嵌入式数据库编程库(引擎),它可以用来保存任意类型的键/值对 (Key/Value Pair),而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据。

BDB提供诸如C语言,C++JavaPerlPythonTcl等多种编程语言的API,并且广泛支持大多数类Unix操作系统和Windows操作系统以及实时操作系统(如 VxWorks)。

1991年,Berkeley DB的第一个版发行(Linux系统也在这一年诞生),其最初的开发目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现,该版本还包含了B+树数据访问算法。

1992年,BSD UNIX4.4发行版中包含了Berkeley DB1.85版。基本上认为这是Berkeley DB的第一个正式版。

1996年,Sleepycat软件公司成立,提供对Berkeley DB的商业支持。

2006年,SleepycatOracle收购,当时最新版本是4.7.25

2009年,SUN被Oracle收购,不知道MySQL会不会再次启用Berkeley DB。

 

2.Berkeley DB的特点

1. 访问速度快
2. 省硬盘空间
Berkeley DB可以轻松支持上千个线程同时访问数据库,支持多进程、事务等特性。Berkeley DB运行在大多数的操作系统中,例如大多数的UNIX系统, 和windows系统,以及实时操作系统。
Berkeley DB 还拥有对一些老的UNIX数据库,例如dbm, ndbm und hsearch的兼容接口,
对于在java系统中的使用,Berkeley DB提供了一个压缩成jar单个文件的java版本。 这个版本可以运行在java虚拟机上使用,并且拥有和C语言版本相同的所有操作和功能。
Berkeley DB XML,是一个接口,通过它可以实现对XML数据存贮的支持。对XML数据的访问,会使用相应的查询语句如Xquery, Xpath。
Berkeley DB只支持单一的数据结构,它的所有数据包括两个部分:key 和 data.
Berkeley DB原则上是为嵌入式数据库设计的。
 
3.Berkeley DB的编译安装和使用
 
----------------------------------------------------------------------------------
# cd /usr/local/src
# wget http://download.oracle.com/berkeley-db/db-4.6.18.tar.gz
# tar -zxvf db-4.6.18.tar.gz
# cd db-4.6.18
# cd build_unix
# ../dist/configure --enable-cxx
# make
# make install

----------------------------------------------------------------------------------
编写test.cpp,将字符“hello world”存入bdb
 
#include <iostream>

#include <string.h>
#include <db_cxx.h>
#include <db.h>

using std::cout;
using std::endl;
using std::cerr;

int
main (int argc, char *argv[])
{
try
{
/* 1: create the database handle */
Db db (0, 0);

/* 2: open the database using the handle */
db.open (NULL, "./chap4_db", NULL, DB_BTREE, DB_CREATE, 0644);

/* 3: create the key and value Dbts */
char *first_key = "first_record";
u_int32_t key_len = (u_int32_t) strlen (first_key);

char * first_value = "Hello World - Berkeley DB style!!";
u_int32_t value_len = (u_int32_t) strlen (first_value);

Dbt key (first_key, key_len + 1);
Dbt value (first_value, value_len + 1);

/* 4: insert the key-value pair into the database */
int ret;
ret = db.put (0, &key, &value, DB_NOOVERWRITE);
if (ret == DB_KEYEXIST)
{
cout << "hello_world: " << first_key << " already exists in db" <<endl;
}

/* 5: read the value stored earlier in a Dbt object */
Dbt stored_value;
ret = db.get (0, &key, &stored_value, 0);

/* 6: print the value read from the database */
cout << (char *) stored_value.get_data () << endl;

/* 7: close the database handle */
db.close (0);
}
catch (DbException & dbex)
{
cerr << "hello_world: exception caught: " << dbex.what () << endl;
}
}

----------------------------------------------------------------------------------
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/BerkeleyDB.4.6/lib/
g++ -Wall test.cpp -o test -ggdb -I/usr/local/BerkeleyDB.4.6/include/ -L/usr/local/BerkeleyDB.4.6/lib/  -ldb_cxx -lpthread
----------------------------------------------------------------------------------
现在来验证结果如何:
# ./test
Hello World - Berkeley DB style!!
# ./test
hello_world: first_record already exists in db
Hello World - Berkeley DB style!!

# file chap4_db
chap4_db: Berkeley DB (Btree, version 9, native byte-order)

使用db_dump查看:

# /usr/local/BerkeleyDB.4.6/bin/db_dump -p chap4_db
VERSION=3
format=print
type=btree
db_pagesize=4096
HEADER=END
first_record\00
Hello World - Berkeley DB style!!\00
DATA=END

----------------------------------------------------------------------------------
最后我们看一下lib目录下面的文件属性

[root@cdn-101-14 lib]# cd /usr/local/BerkeleyDB.4.6/lib/
[root@cdn-101-14 lib]# file *
libdb-4.6.a: current ar archive
libdb-4.6.la: libtool library file
libdb-4.6.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
libdb-4.so: symbolic link to `libdb-4.6.so'
libdb.a: current ar archive
libdb_cxx-4.6.a: current ar archive
libdb_cxx-4.6.la: libtool library file
libdb_cxx-4.6.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
libdb_cxx-4.so: symbolic link to `libdb_cxx-4.6.so'
libdb_cxx.a: current ar archive
libdb_cxx.so: symbolic link to `libdb_cxx-4.6.so'
libdb.so: symbolic link to `libdb-4.6.so'

----------------------------------------------------------------------------------
 写完收工  = 。=
 

转载于:https://www.cnblogs.com/yangtze736-2013-3-6/p/3532798.html

### Berkeley DB 介绍 Berkeley DB 是一种嵌入式的键值数据库库,提供了程序对于数据的存储和检索功能。这种类型的数据库不需要独立运行的服务进程,而是通过链接到应用程序的方式工作,在应用启动时初始化并随其一同结束。由于其实现简单高效的特点,广泛应用于各种软件项目中[^1]。 ### 安装过程概述 针对不同版本的 Berkeley DB,默认安装路径会有所不同。例如: - 对于较早版本如4.6版,默认会被放置在 `/usr/local/BerkeleyDB.4.6` 文件夹内; - 而更新一些的5.3版本则位于 `/usr/local/BerkeleyDB.5.3` 中; 当然,用户可以通过配置 `--prefix` 参数来自定义目标位置。比如执行命令 `# ../dist/configure --enable-cxx` 可以改变默认安装地点至 `/usr/local/berkeleydb` 并启用 C++ 支持选项[^3]。 #### 针对特定环境下的说明 (Ubuntu) 如果是在基于 Ubuntu 的环境中操作,则需要注意操作系统本身以及所选 Berkeley DB 版本之间的兼容性问题。例如,在 Ubuntu 16.04 LTS 上部署 Berkeley DB 18.1.25 版本时,应当确认两者间的依赖关系已被妥善处理。 ### 使用指南 要开始使用 Berkeley DB,首先要确保已经成功完成了上述提到的编译与安装流程。之后可以根据编程语言的不同选择合适的 API 进行开发。以下是 Python 下的一个简单例子展示如何打开现有数据库文件或创建新的实例: ```python import bsddb3 try: # 尝试打开现有的 btree 类型数据库 'example.db' db = bsddb3.btopen('example.db', 'c') # 向数据库添加条目 key = "key".encode() value = "value".encode() db[key] = value finally: if not db is None: db.close() # 关闭连接 ``` 此段代码展示了怎样利用 Python 绑定模块 `bsddb3` 来管理 BTree 结构的数据集。请注意实际应用场景可能涉及更复杂的逻辑设计和技术细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值