• Berkeley DB学习笔记2

    2007-07-12 | Tag:无题

    BerkeleyDB中,数据库相当于关系数据库中的表,且每个表只有两列:key和data。需要有程序员自己将数据封装入data中,key相当于主键,用于区分不同的记录。通常使用结构或类对数据进行封装,将2列表变成n列表,其中n-1列封装在结构中。
    使用DBAPI时,一般是与特定的数据结构交互。数据结构中保存函数指针,称为句柄(handle)。操作流程一般是获得数据库句柄,对其调用get、put函数进行操作。向DB中put数据时,一般根据key排序,如果DB中已存在待插入的key,则用新的data替换已有data,除非DB支持重复key。
    除了使用句柄,可以使用游标(cursor)遍历数据库,包括正向、逆向、随机查询记录。另外,当数据库支持重复key时,句柄只能获得相同key的第一条记录,只有游标可以遍历重复key记录。
    DB提供一种特殊的数据库称为二级数据库(secondarydatabase),通常意义的数据库称为主数据库(primarydatabase)。原理类似于倒排索引,用于支持按照data进行检索。
    DB的存储模式包括BTree、Hash、Queue、recno。BTree和Hash允许key、data均为结构,而另两个只能用int作为key,Queue在尾部插入,头部取出,支持记录级别的加锁。
    environment
    environment是对一个或多个数据库的封装,因为空间的限制,在嵌入式数据库中很少用,但其他应用一般都会用到,使用DB时,先打开environment,再在该environment下打开数据库。
    environment提供单个数据库不提供的优势:
    1、多数据库文件:在一个物理文件中包含多个数据库,则必须使用environment
    2、多线程多进程支持
    3、事务处理
    4、replication支持
    5、日志子系统,用于数据库恢复
    异常处理:抛出DbException,并且操作不成功都返回非零数值。返回零意味着操作成功。

    #include

    ...

    try

    {

      // DB and other code goes here

    }

    catch(DbException &e)

    {

      // DB error handling goeshere

    }

    catch(std::exception &e)

    {

      // All other error handling goes here

    }

    数据库的打开与关闭

    #include
    ...
    Db db(NULL,0);              // Instantiate the Db object
    u_int32_t oFlags = DB_CREATE; // Open flags;
    try {
        // Open thedatabase
       db.open(NULL,               //事务指针
               "my_db.db",         //数据库文件名
               NULL,               //可选数据库逻辑名称
               DB_BTREE,           //存取模式
               oFlags,             //打开标志位
               0);                 //文件模式(默认)
        //DbException is not subclassed from std::exception, so
        // need tocatch both of these.
    }

    catch(DbException &e)

    {
        // Errorhandling code goes here
    }

    catch(std::exception &e)

    {
        // Errorhandling code goes here
    }



     

    收藏到:Del.icio.us




    引用地址:

    评论

  • 谢谢你的,我明白了。真的好谢谢你。祝你每天都有好心情。
    Ren回复ardan说:
    不客气,呵呵
    2010-11-29 08:00:36
  • 我还想知道你当时是怎么学BerkeleyDB的,官方的文档好多,例子很少,看了之后还不是很明白,我们实验室只有我一个人在学数据库,我不知道问谁,所以打扰你了。如果忙,就不用回复我的,我自己再研究研究。只能少于200字,所以我分了两条消息。谢谢你~。
    Ren回复ardan说:
    我只是在本科毕设时候简单尝试过bdb,后来也没具体用过,刚才试了一下,同键值插入的话和put的最后一个参数有关。如果使用追加模式,并且数据库类型不是Queue或者Recno模式的话会抛出异常,不知道是不是你遇到的问题。具体可以找本书看看。百度文库可以搜索到一些带范例的电子书。
    2010-11-27 22:18:24
  • 有点冒昧了,我有好几个问题想问你,能不能在不忙的时候给我回复的。我刚刚接触BerkeleyDB,写了一个小程序,我用的是VC6.0,我发现了几个问题。1、当存入的数据有相同的key就会报错,怎么可以写入相同的key呢。2、我做了一个时间的测试,发现写入txt的速度比写入数据库的速度快很多,理论上应该蛮快的呀,这个问题要怎么解决呢。3、我写入数据只有4000k,写到数据库却有6000多k。
    Ren回复ardan说:
    第二个问题不太清楚你比较的方法。写入文本的时候是顺序插入的吗?如果是的话比bdb快也是正常的吧,毕竟bdb要维护树形结构或者哈希表。它的优势显然是在查询呐,文本查询复杂度是线性的,而树形是对数的,哈希平均是常数的。
    2010-11-27 22:26:10