您的位置:首页 > 数据库

Berkeley DB 以及 DB_SECONDARY_BAD: Secondary index inconsistent with primary 问题

2008-11-21 13:32 495 查看
项目需要,最近开始学习Berkeley DB,先列举一些我能理解的Berkeley DB的优点。

一 优点

  Berkeley DB提供快速,可靠,和事务保护的记录存储。

  Berkeley DB是嵌入式数据库,可以和你的应用方便的运行在同一地址空间,这对高效率的程序来说很有用。

  Berkeley DB可以指定每个表的存储方式,这使得你可以根据这张表的应用环境更加的优化程序。(“表”被称为“数据库”,“数据库”被称为环境)

二   缺点
  只有漂亮的代码,但没有完美的代码。

  交互操作比较简单:

        这使得在Berkeleydb上的复杂查询变得困难,对程序员来说也是一个挑战。

  定位:

        berkeleydb更应该说是一种面向程序员的数据库,面对复杂的应用时,会增加程序员大量的工作。

  再列举一些典型应用

三 典型应用

  任务队列:

        为什么这里提到任务队列呢?在服务器程序开发中,对程序的可靠性要求是很高的,当你的程序断电重启时,我们不希望任务信息被丢掉,而是希望重新开始执行。因此可以将你的任务放在db中。有的程序员可能会考虑到性能上的损失,但是berkeleydb的缓存机制已经相当漂亮,在你选择了正确的存储方式和适当配置了berkeleydb时,相信性能不是问题。在berkeleydb的api中,也可以发现便于提供任务队列的接口,如等待一个特定的记录等。

四 DB_SECONDARY_BAD: Secondary index inconsistent with primary 问题

  我的berkeleydb用到了从属数据库,因此我写了回调函数,关联了主数据库和从属数据库。

  但是在调用dbp->put(dbp,NULL,&key, &data, DB_NOOVERWRITE); 的时候,出现了DB_SECONDARY_BAD: Secondary index inconsistent with primary 的错误。为什么会出现不一致呢?我首先怀疑回调函数是否执行正常,但函数体内的代码并没有什么问题,最容易出错的skey->size = strlen(XXX) + 1也是正常的,但多次重复回调之后,发现出现了一个主数据库中原有的值,这是因为我在建从属数据库的时候,主数据库早已存在并且有数据,由于处理不当,造成了主从不一致的情况。删掉主数据库重建,则问题解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐