我编写了一个在C/C++中使用伯克利数据库的程序,就像混合程序一样。我有一个名为bdb的类。
int open(char *db_name)
{
flags = DB_CREATE;
u_int32_t envCreateFlags = DB_CREATE |
DB_INIT_LOCK|
DB_INIT_LOG|
DB_INIT_MPOOL|
DB_INIT_TXN|
DB_RECOVER |
DB_THREAD;
ret = db_env_create(&dbenv, 0);
dbenv->err(dbenv,ret,"err db_env_create ");
ret = dbenv->open(dbenv,"./",envCreateFlags,0);
dbenv->err(dbenv,ret,"err db_env_open ");
ret = db_create(&dbp,dbenv, 0);
dbp->err(dbp,ret,"err db_create ");
ret = dbp->open(dbp, /* DB structure pointer */
NULL, /* Transaction pointer */
db_name, /* On-disk file that holds the database. */
NULL, /* Optional logical database name */
DB_BTREE, /* Database access method */
flags, /* Open flags */
0); /* File mode (using defaults) */
dbp->err(dbp,ret,"err dbp open ");
return ret;
};接下来,在程序中,我将使用如下方法
int getEntry( char *url ,unsigned int *fp)
{
DBT key, data;
DBC *cursorp;
dbp->cursor(dbp, NULL, &cursorp, 0);
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = fp;
key.ulen = sizeof(unsigned int);
key.flags = DB_DBT_USERMEM;
data.data = url;
data.ulen = sizeof(char) * maxUrlSize;
data.flags = DB_DBT_USERMEM;
ret = cursorp->c_get(cursorp, &key,&data, DB_PREV);
if (cursorp != NULL)
cursorp->close(cursorp);
if (ret == DB_NOTFOUND)
return -1;
}因此,对象是被创建的,而不是给多个线程。他们都去了getEntry和checkUpdate,也许是在同一时间。
结果是每次我在节目开始后
PANIC: fatal region error detected; run recovery
PANIC: fatal region error detected; run recovery我在线路上发现了一个分割错误
ret = cursorp->c_get(cursorp, &key,&data, DB_PREV);我也不知道原因?
发布于 2011-04-25 23:05:52
您可能需要考虑在OTN上将您的问题发布到伯克利DB论坛上。有一个活跃的应用程序开发人员、支持工程师和BDB开发人员社区,他们在该论坛上进行交互。
以下是几种快速的可能性:
以下文档可能是有用的:第四章 of C++入门指南,C++入门指南中的示例,参考GuideY中的程序员备注章节。
如果这不能解决您的问题,我鼓励您张贴到上述伯克利DB论坛。
https://stackoverflow.com/questions/5771363
复制相似问题