学习Berkeley DB- 入门
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- 入门的更多相关文章
- 比Redis更快:Berkeley DB面面观
比Redis更快:Berkeley DB面面观 Redis很火,最近大家用的多.从两年前开始,Memcached转向Redis逐渐成为潮流:而Berkeley DB可能很多朋友还很陌生,首先,我们简单 ...
- 新浪研发中心: Berkeley DB 使用经验总结
http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...
- Berkeley DB 使用经验总结
作者:陈磊 NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Berkeley DB作为一款优秀的Key/Value存储引擎自然也在讨论之列.最近使用BDB来发 ...
- 免费数据库(SQLite、Berkeley DB、PostgreSQL、MySQL、Firebird、mSQL、MSDE、DB2 Express-C、Oracle XE)
SQLite数据库是中小站点CMS的最佳选择 SQLite 是一个类似Access的轻量级数据库系统,但是更小.更快.容量更大,并发更高.为什么说 SQLite 最适合做 CMS (内容管理系统)呢? ...
- Java编程学习知识点分享 入门必看
Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...
- Berkeley DB使用SecondKey给数据排序的实现方法
Berkeley DB使用SecondKey给数据排序的 实现方法是本文我们主要要介绍的内容,在做项目的时候用到了nosql数据库BDB,借此机会研究了一下它的用法.它的官方示例和文档比较丰富,感觉比 ...
- 前端学习 node 快速入门 系列 —— 报名系统 - [express]
其他章节请看: 前端学习 node 快速入门 系列 报名系统 - [express] 最简单的报名系统: 只有两个页面 人员信息列表页:展示已报名的人员信息列表.里面有一个报名按钮,点击按钮则会跳转到 ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
随机推荐
- Spring 复习笔记01
Spring 框架 1. core:整个Spring框架构建在Core核心模块上,它是整个框架的的基础. 2. AOP:AOP模块提供了一个轻便但功能强大强大的AOP框架,让我们可以以AOP的形式增强 ...
- flex mx组件和s组件的字体兼容性不一致
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- 【jqGrid for ASP.NET MVC Documentation】.学习笔记.7.搜索过滤数据
1 基础 搜索和过滤功能,是使用确定的条件,查找匹配行数据.jqGrid提供几种搜索模式: Search Dialog 单搜索选项 Search Dialog 多搜索选项 ToolBar Search ...
- 利用python进行数据分析 (学习笔记)
第一章:准备工作 1.重要的Python库 (1)NumPy:Python科学计算的基础包.功能有:
- HDU 5968:异或密码(暴力)
http://acm.hdu.edu.cn/showproblem.php?pid=5968 题意:中文题意. 思路:一开始不会做,后来发现数据范围很小,而且那个数要是连续的,所以可能把所有情况枚举出 ...
- UPnP基本原理介绍
http://blog.csdn.net/braddoris/article/details/41576515 随着计算机产业以及计算机网络技术的迅猛发展,越来越多嵌入式设备的出现和家庭网络的发展,实 ...
- HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4528 小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/O ...
- linux中快捷键
ctrl+c 终止现在的进程 ctrl+d 退出现在的命令行,类似于exit shift+pageup/pagedown 向上或向下翻页
- uploadify的用法与动态传参 提供demo下载
---恢复内容开始--- 官网:http://www.uploadify.com/ 一款不错的上传插件.官方文档http://www.uploadify.com/documentation/ 用法 ...
- CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境
一.简介 什么是LAMP LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而言都是在它所代 ...