`
colin115
  • 浏览: 40017 次
社区版块
存档分类
最新评论

学习Berkeley DB- 入门

    博客分类:
  • C++
 
阅读更多

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.bdbchina.com/

文档中心:http://www.oracle.com/technology/documentation/berkeley-db/db/index.html

Berkeley DB官方论坛(貌似已经无人维护):

https://forums.oracle.com/community/developer/english/berkeley_db_family

 

 

Posted by: 大CC | 17SEP,2013

博客:blog.me115.com

微博:新浪微博

 

0
3
分享到:
评论

相关推荐

    Berkeley DB -- 入门知识和一个小例子_iyangjian2005997_新浪博客.mht

    Berkeley DB -- 入门知识和一个小例子_iyangjian2005997_新浪博客.mht

    Berkeley DB C++编程入门教

    介绍DB API的设置与使用的快速入门手册,目标是提供一个快速有效地机制,能让你进入Berkeley DB研发的世界。在本文中侧重于C++语言的研发人员,以及研究进城内数据管理解决方案的资深架构师。

    Berkeley DB入门篇.doc

    berkeley db 相关资料,本想整理好放进来,但由于时间问题,未能进一步修正,欢迎大家指导。

    Berkeley DB数据库C语言入门教程.doc

    Berkeley DB数据库C语言入门教程.doc

    Berkeley DB编程宝典(入门到提高)

    里面包括了Berkeley DB的入门知识,以及提高!还有开发指南!目前在市面上比较全的入门资料!还有开发工具。。。。。。超值。。。

    Berkeley DB数据库支持事物的C++语言入门教程

    本文描述了如何在Berkeley DB中使用事务(Transaction)。它简要介绍了事务是如何保护你的应用的数据的...本书假设你已经了解BerkeleyDB的基本架构知识(这些知识在<Getting Started with Berkeley DB Guide>一书中。)

    精:Berkeley DB XML入门详解

    NULL 博文链接:https://lancui.iteye.com/blog/812535

    BerkeleyDB.Core.Examples:使用.NET Core的Oracle Berkeley DB示例应用程序的公共存储库

    BerkeleyDb.Core入门项目 这些项目的目的是使用使用C#的Berkeley .NET Core库复制Oracle Berkeley DB文档中内置的演示应用程序。 这些样本不是原始文档的一对一复制,而是展示了嵌入式数据库存储中Berkeley DB库中...

    SVN使用手册中文版快速入门

    Berkeley DB配置 版本库维护 管理员的工具箱 svnlook svnadmin svndumpfilter svnshell.py Berkeley DB工具 版本库清理 管理磁盘空间 版本库的恢复 版本库的移植 版本库备份 添加项目 选择一种版本库布局 创建布局,...

    SVN使用手册中文版.chm

    Berkeley DB工具 版本库清理 管理磁盘空间 版本库的恢复 版本库的移植 版本库备份 添加项目 选择一种版本库布局 创建布局,导入初始数据 摘要 6. 配置服务器 概述 网络模型 请求和响应 客户端凭证缓存 svnserve,一...

    使用Subversion进行版本控制(针对 Subversion 1.4)

    删除不使用的Berkeley DB日志文件 Berkeley DB 恢复 版本库数据的移植 过滤版本库历史 版本库复制 版本库备份 总结 6. 服务配置 概述 选择一个服务器配置 svnserve服务器 svnserve使用SSH通道 Apache 的 HTTP 服务器...

    linux系统移植_第二版_part2

    第4篇从嵌入式产品角度出发,介绍了gui、qtopia、嵌入式数据库berkeley db和sqlite、嵌入式web服务器boa和thttpd、jvm虚拟机的移植及目前流行的voip技术和相关协议。 本书适合嵌入式linux系统入门人员、linux系统...

    linux系统移植_第二版_part1

    第4篇从嵌入式产品角度出发,介绍了gui、qtopia、嵌入式数据库berkeley db和sqlite、嵌入式web服务器boa和thttpd、jvm虚拟机的移植及目前流行的voip技术和相关协议。 本书适合嵌入式linux系统入门人员、linux系统...

    linux系统移植

    第4篇从嵌入式产品角度出发,介绍了GUI、Qtopia、嵌入式数据库Berkeley DB和SQLite、嵌入式Web服务器BOA和Thttpd、JVM虚拟机的移植及目前流行的VoIP技术和相关协议。, 《Linux系统移植》适合嵌入式Linux系统入门人员...

    nosql 入门教程

    10.2.1 SimpleDB入门 176 10.2.2 使用REST API 178 10.2.3 使用Java访问SimpleDB 181 10.2.4 通过Ruby和Python使用SimpleDB 182 10.3 小结 183 第11章 MapReduce可扩展并行处理 185 11.1 理解MapReduce 186 ...

    sks-keyserver

    Berkeley DB 版本 4.6.* 或更高版本。 您可以在找到合适的版本 GNU Make 和 C 编译器(例如 gcc) 验证下载的完整性 使用公钥服务器上可用的 SKS 密钥服务器签名密钥对 SKS 的发行版进行签名,并带有 KeyID 0x...

    sks-keyserver:OpenPGP密钥服务器

    Berkeley DB 4.6。*版或更高版本。 您可以在找到适当的版本 GNU Make和一个C编译器(例如gcc) 验证下载的完整性 使用可在公共密钥服务器上使用带有密钥ID的SKS密钥服务器签名密钥对SKS的发行版进行签名 0x...

Global site tag (gtag.js) - Google Analytics