BerkeleyDB的多线程支持

      原先为了在多线程环境下使用bdb,还专门在调用其API前加线程锁。自己加锁除了多出工作量以外,还有一个麻烦:当一个DB的数据很大时,对它的加锁粒度就太大了,会拖慢性能。
后来才发现bdb自己是可以在多线程环境下使用的,只是在DB_ENV初始化时需要加标记:

    DB_ENV *dbenv;
    u_int32_t flags;
    
    flags | = DB_THREAD;
    dbenv->open(dbenv, “/home/data/”, flags, 0);

      在这个DB_ENV下的操作就是线程安全的了,不过还有一点要注意,就是get数据时作为value的DBT需要加DB_DBT_THREAD标记(参考):

    DBT tKey,tValue;
    tValue.flags = DB_DBT_MALLOC;
    ...
    int ret=m_dbp->get(m_dbp,NULL,&tKey,&tValue,0);
    ...
    free(tValue.data);    //由于tValue.data指向的内存是bdb用malloc分配的,所以现在需要用户自己free

       使用bdb自己的多线程支持比外部加锁方便、高效很多。


相关文章

分类

1 Comments

邬文俊 said:

你好,我也在做一个BDB性能实验,主要是测程序写的性能。
数据库有2个,一个主,一个为次索引数据库。都是bree结构

插入数据主键大小为12字节 值为4字节
开始插入的时候很快,可以一万多条每秒。但是数据插入会越来越慢,到上百万的时候,就下降到了开始的一半左右了,请问这是什么原因呢,如果实验继续下去是不是会变得更慢。
如果重新启动程序,还是原来的数据库文件,结果开始的插入速度和上次开始插入速度相比会略慢,然后继续进入性能下降的过程。

真是古怪啊。

如果你知道答案可以给我邮件吗?
wenjunwu430@gmail.com

留言:

关于文章

This page contains a single entry by DongHao published on 12 3, 2008 9:45 AM.

周年 was the previous entry in this blog.

fedora 9 试用 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.