zoukankan      html  css  js  c++  java
  • 学习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()函数来完成的,其原型如下所示: 
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14 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
    ", 
        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); 
    
    删除数据只需给出相应的关键字,不用指明与之对应的数据。 
    
    1
    2
    3
    4
    5
    6
    7 eg: 
    key.data = "sport"; 
    key.size = sizeof("sport"); 
    if ((ret = dbp->del(dbp, NULL, &key, 0)) == 0) 
    printf("db: %s: key was deleted.
    ", (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 
  • 相关阅读:
    定位属性position,相对定位,绝对定位
    flex弹性盒模型?
    vue生命周期
    理解cookie、session、token
    前端兼容性问题
    JS 如何为一个元素怎么绑定多个事件?
    js数组的操作方法
    vue页面翻页勾选的记忆功能
    Vue中nextTick的正确使用
    Vue用router.push(传参)跳转页面,参数改变,跳转页面数据不刷新的解决办法
  • 原文地址:https://www.cnblogs.com/zendu/p/4981153.html
Copyright © 2011-2022 走看看