BerkeleyDB 不存储文件

Posted

技术标签:

【中文标题】BerkeleyDB 不存储文件【英文标题】:BerkeleyDB doesn't store files 【发布时间】:2015-07-16 14:44:44 【问题描述】:

我开始使用 BerkeleyDB。我编写了以下方法将值插入数据库:

void Put(int key, int value)
    DB *dbp;
    int ret;

    if((ret=db_create(&dbp,NULL,0))!=0)
        fprintf(stderr,"db_create failed: %s\n",db_strerror(ret));
        exit(1);
    
    ret=dbp->open(
        dbp,
        NULL,
        "berkeley.db",
        NULL,
        DB_BTREE,
        DB_CREATE,
        0
    );

    DBT bin_key, bin_value;
    memset(&bin_key,0,sizeof(DBT));
    memset(&bin_value,0,sizeof(DBT));

    bin_key.data=&key;
    bin_value.data=&value;

    bin_key.size=sizeof(int);
    bin_value.size=sizeof(int);

    if((ret=dbp->put(dbp, NULL, &bin_key, &bin_value, DB_NOOVERWRITE))!=0)
        printf("Put failed");
    ;
    return;

调用Put() 方法后,我没有收到任何错误。使用工具dump_db berkeley.db 转储数据库得到数据库。已创建,但数据库中仍然没有值。

有什么想法吗?

【问题讨论】:

你在open()之后从不检查ret...? 我已经用调试器检查过了。在这两种情况下,它都是 0 【参考方案1】:

如果您在退出程序之前没有关闭数据库,您可能希望这样做,例如,在您的 Put() 函数结束时:

if(dbp->close(dbp, 0)) != 0)

    printf("Close failed\n");

可能是您放入数据库的数据仅添加到缓存中而不写入磁盘。在这种情况下,需要调用函数 close() 才能将数据刷新到磁盘:

说明

DB->close 函数将所有缓存的数据库信息刷新到磁盘,关闭所有打开的游标,释放所有分配的资源,并关闭所有底层文件。由于键/数据对缓存在内存中,因此无法使用DB->closeDB->sync 函数同步文件可能会导致信息不一致或丢失。

【讨论】:

以上是关于BerkeleyDB 不存储文件的主要内容,如果未能解决你的问题,请参考以下文章

Citadel 如何仅使用 BerkeleyDB 键/值存储来构建数据?

Berkeley DB 文件压缩

分层数据和 Berkeley DB

Subversion存储库类型

您如何将关系实体表示为 BerkeleyDB 中可检索数据的单个单元?

Titan BatchLoading berkeleydb 不持久