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自己的多线程支持比外部加锁方便、高效很多。
后来才发现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自己的多线程支持比外部加锁方便、高效很多。
相关文章
- 客服琐记 - 08 12, 2010
- 多线程并非万金油 - 07 13, 2010
- BerkeleyDB删除数据时的“内存泄漏”问题 - 04 08, 2009
你好,我也在做一个BDB性能实验,主要是测程序写的性能。
数据库有2个,一个主,一个为次索引数据库。都是bree结构
插入数据主键大小为12字节 值为4字节
开始插入的时候很快,可以一万多条每秒。但是数据插入会越来越慢,到上百万的时候,就下降到了开始的一半左右了,请问这是什么原因呢,如果实验继续下去是不是会变得更慢。
如果重新启动程序,还是原来的数据库文件,结果开始的插入速度和上次开始插入速度相比会略慢,然后继续进入性能下降的过程。
真是古怪啊。
如果你知道答案可以给我邮件吗?
wenjunwu430@gmail.com