1 导言
首先,我们要了解Berkeley DB的一些基本特性,在IBM的开发网站上有篇文章对其有比较清晰的介绍;
这篇文章讲到了BDB的设计思想和核心数据结构、以及数据访问算法;并有常用函数使用范例;算是接触BDB的一个入门好材料;
进入以下url阅读:
http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html
我现在的问题是,我们需要使用BDB的话,有以下问题需要解决:
如何使用各个常用操作?
数据访问算法的选择?
性能如何?需要做一个贴近实际的性能测试;
BDB支持多索引,那么多索引是如何建立的?
针对特定环境,如何建立合适的索引?
如何封装,以便于我们方便的使用?
如何将SQL移植为NOSQL?
在接下来的学习中,我将集中解决以上问题;
在这篇文章中,我们学习BDB的常用操作。
2 下载安装
Berkeley DB下载
oracle Berkeley DB官网:
http://www.oracle.com/us/products/database/berkeley-db/overview/index.html
http://www.oracle.com/technetwork/products/berkeleydb/downloads/index.html?ssSourceSiteId=ocomen
下载版本:Berkeley DB 6.0.20.tar.gz
安装
进入对应环境的安装目录:
cd build_unix
../dist/configure --prefix=/opt/app/todeav1/soft/bdb/
环境变量部署
BDB_HOME=/opt/app/todeav1/colin/db;export BDB_HOME
LIBPATH=$BDB_HOME/bin:$LIBPATH; export LIBPATH
LD_LIBRARY_PATH=$BDB_HOME/lib:$LD_LIBRARY_PATH;export LD_LIBRARY_PATH
编译
g++ -o test demo.cpp -I$BDB_HOME/include/ -L$BDB_HOME/lib/ -ldb –lpthread
3 常用操作
打开数据库
首先调用db_create()函数来创建DB 结构的一个实例,然后再调用DB->open()函数来完成真正的打开操作。
Berkeley DB 将所有对数据库的操作都封装在名为DB 的结构中。db_create()函数的作用就是创建一个该结构。
将磁盘上保存的文件作为数据库打开是由DB->open()函数来完成的,其原型如下所示:
int DB->open(DB *db, DB_TXN *txnid, const char *file, const char *database, DBTYPE type, u_int32_t flags, int mode); eg: if ((ret = db_create(&dbp, NULL, 0)) != 0) { fprintf(stderr, "db_create: %s\n", db_strerror(ret)); exit (1); } if ((ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) { dbp->err(dbp, ret, "%s", DATABASE); exit (1); }
参数“DATABASE”指明对应的磁盘文件名为demo.db;参数“DB_BTREE”表示数据库底层使用的数据结构是B 树;而参数“DB_CREATE”和“0664”则表明当数据库文件不存在时创建一个新的数据库文件,并且将该文件的属性值设置为0664。
错误处理是在打开数据库时必须的例行检查,这可以通过调用DB->err()函数来完成。其中 参数“ret”是在调用Berkeley DB 函数后返回的错误代码,其余参数则用于显示结构化的错 误信息。
插入
向Berkeley DB 数据库中添加数据可以通过调用DB->put()函数来完成,其原型如下所示:
int DB->put(DB *db, DB_TXN *txnid, DBT *key, DBT *data,
u_int32_t flags);
在向数据库中添加数据时,如果给定的关键字已经存在,大多数应用会对于已经存在的数据。
采用覆盖原则。也就是说,如果数据库中已经保存了一个“sport/basketball”对,再次调用DB->put()函数添加一个“sport/football”对,那么先前保存的那些数据将会被覆盖。但Berkeley DB 允许在调用DB->put()函数时指定参数“DB_NOOVERWRITE”,声明不对数据库中已经存在的数据进行覆盖,一旦给出“DB_NOOVERWRITE”标记,如果DB->put()函数在执行过程中发现给出的关键字在数据库中已经存在了,就无法成功地把该Key/Data 对添加到数据库中,于是将返回错误代码 “DB_KEYEXIST”。
检索数据
从Berkeley DB 数据库中检索数据可以通过调用DB->get()函数来完成,其原型如下所示:
int DB->get(DB *db, DB_TXN *txnid, DBT *key, DBT *data,
u_int32_t flags);
在进行数据检索时,对DB->get()函数的返回值进行处理是必不可少的,因为它携带着检索操作是否成功完成等信息。下面列出的是DB->get()函数的返回值:
◆0 函数调用成功,指定的关键字被找到;
◆DB_NOTFOUND 函数调用成功,但指定的关键字未被找到;
◆大于0 函数调用失败,可能出现了系统错误。
删除
从Berkeley DB 数据库中删除数据可以通过调用DB->del()函数来完成,其原型如下所示:
int DB->del(DB *db, DB_TXN *txnid, DBT *key, u_int32_t flags);
删除数据只需给出相应的关键字,不用指明与之对应的数据。
eg: key.data = "sport"; key.size = sizeof("sport"); if ((ret = dbp->del(dbp, NULL, &key, 0)) == 0) printf("db: %s: key was deleted.\n", (char*)key.data); else dbp->err(dbp, ret, "DB->del");
关闭数据库
对于一次完整的数据库操作过程来说,关闭数据库是不可或缺的一个 节。这是因为Berkeley DB 需要依赖于系统底层的缓冲机制,也就是说只有在数据库正常关闭的时候,修改后的数据才有可能全部写到磁盘上,同时它所占用的资源也才能真正被全部释放。关闭数据库的操作是通过调用DB->close()函数来完成的,其原型如下所示:
int DB->close(DB *db, u_int32_t flags);
刷新缓存到硬盘
Berkeley DB的所有操作都是在内存中进行,在关闭数据库句柄时,会将所有数据写入到硬盘中;在程序运行中,如需要同步数据到硬盘,可调用sync()函数:
注:这个函数在4.3之前的版本是无参的,而在之后的版本增加参数,修改之前的例子需注意兼容;
dbp->sync(dbp,0);
更多
这篇文章对插入时每个操作有个详细的说明,并给出了进一步学习的文档link;
Berkeley DB示例程序详解 (1)
http://www.bdbchina.com/2009/02/berkeley-db%E7%A4%BA%E4%BE%8B%E7%A8%8B%E5%BA%8F%E8%AF%A6%E8%A7%A3-1/
4 更多学习资料
Berkeley DB 官方开发者文档
http://docs.oracle.com/cd/E17076_03/html/index.html
官方主页:http://www.oracle.com/database/berkeley-db/db/index.html
产品下载:http://www.oracle.com/technology/software/products/berkeley-db/index.html
Berkeley DB中国研发团队博客:
文档中心:http://www.oracle.com/technology/documentation/berkeley-db/db/index.html
Berkeley DB官方论坛(貌似已经无人维护):
https://forums.oracle.com/community/developer/english/berkeley_db_family
相关推荐
### Berkeley DB (C) 开发入门与核心技术解析 #### 概述 Berkeley DB(简称 BDB)是一款高性能的关键值存储数据库系统,被广泛应用于多种操作系统之上,支持多种访问方法和事务处理机制。该文档主要介绍了如何使用...
Berkeley DB -- 入门知识和一个小例子_iyangjian2005997_新浪博客.mht
在“BerkeleyDB概念”部分,文档会介绍Berkeley DB的基本概念,如BTree和Hash数据库的访问方式选择,以及Queue和Recno之间的选择。 接下来,教程会讨论数据库的限制与可移植性、环境设置、异常处理和错误返回。然后...
根据提供的文档信息,“BerkeleyDB-Core-JAVA-GSG.pdf”主要介绍了如何在Java环境中使用Berkeley DB。该文档强调了Berkeley DB作为一种文件类型数据库的优势,包括快速的存取速度和方便的操作特性。 #### 二、...
《BerkeleyDB Manual C/C++》是一份详尽的官方文档,主要针对...通过学习这些文档,开发者能够掌握BerkeleyDB的核心功能,包括事务管理、数据库操作和性能优化,从而在自己的软件中实现可靠且高效的数据库解决方案。
BerkeleyDB 多库联合操作 (Secondary Databases) - **3.1 二级数据库介绍** - **概念解释**:二级数据库是对主数据库的一个索引,用于提高查询效率。 - **应用场景**:快速查找、数据统计等。 - **3.2 创建二级...
#### 1.1 Introduction to BerkeleyDB Cursor - **定义与作用**:游标是Berkeley DB提供的一种高效访问数据库记录的方式,通过游标可以实现对数据库中记录的查找、修改和删除等操作。 - **应用场景**:适用于需要...
总的来说,《Berkeley DB数据库C语言入门教程》是一个全面的学习资源,涵盖了从基础操作到高级特性的方方面面,是学习和掌握Berkeley DB数据库操作的宝贵资料。通过阅读和实践,开发者可以有效地利用Berkeley DB来...
环境管理在Berkeley DB中扮演着关键角色,它提供了一个环境类(DB_ENV)来管理多个数据库的共享资源,如缓存、日志文件、事务等。异常处理和错误返回机制使得开发者能够更好地处理运行时的错误和异常,确保系统的...
**Berkeley DB编程宝典(入门到提高)** Berkeley DB(简称BDB)是由Oracle公司提供的一个开源、轻量级、嵌入式数据库引擎,主要用于处理简单的键值对存储和事务处理。这本书《Berkeley DB编程宝典》旨在帮助初学者...
本文描述了如何在Berkeley DB中使用事务(Transaction)。它简要介绍了事务是如何保护你的应用的数据的...本书假设你已经了解BerkeleyDB的基本架构知识(这些知识在<Getting Started with Berkeley DB Guide>一书中。)
### Berkeley_DB 参考手册知识点概览 #### 1. Berkeley DB 概述 - **开发者**:Berkeley DB 由 Sleepycat Software 公司开发,后被 Oracle 收购。 - **特性**:Berkeley DB 是一个高度可定制且性能卓越的嵌入式...
NULL 博文链接:https://lancui.iteye.com/blog/812535
总之,Berkeley DB 4.6是一个功能强大、高效灵活的嵌入式数据库,通过深入学习和实践,开发者可以充分利用其特性,构建出高效稳定的应用系统。无论是作为新手入门,还是资深开发者维护旧系统,DB4.6都是一个值得研究...
BerkeleyDb.Core入门项目 这些项目的目的是使用使用C#的Berkeley .NET Core库复制Oracle Berkeley DB文档中内置的演示应用程序。 这些样本不是原始文档的一对一复制,而是展示了嵌入式数据库存储中Berkeley DB库中...
### Berkely DB Java:Oracle Berkeley DB for Java 11g Release 2 入门指南 #### 关于本书 本手册旨在介绍如何使用Oracle Berkeley DB for Java,并为开发人员提供一个全面的理解框架,以便他们能够有效地利用...