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->close
或DB->sync
函数同步文件可能会导致信息不一致或丢失。
【讨论】:
以上是关于BerkeleyDB 不存储文件的主要内容,如果未能解决你的问题,请参考以下文章
Citadel 如何仅使用 BerkeleyDB 键/值存储来构建数据?