七猫的藏经阁

其实只是垃圾箱

VC知识库BLOG 首页 新随笔 联系 聚合 登录
  195 Posts :: 0 Stories :: 639 Comments :: 5 Trackbacks

公告

其实我们每个人都是井底之蛙,最多在不同的井而已。

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

好友

搜索

最新评论

阅读排行榜

评论排行榜

int main(int argc,char *argv[])
{
DB_ENV *dbenv;
int ret = db_env_create(&dbenv, 0);
dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0);
ret = dbenv->open(dbenv, "d:\\test\\", DB_CREATE|DB_INIT_LOG| DB_INIT_MPOOL, 0);

{
DB *dbp1=NULL;
ret = db_create(&dbp1, dbenv, 0);
int flags = DB_CREATE;
ret = dbp1->open(dbp1, NULL, "kingstock.db", "test1", DB_BTREE, flags, 0);
dbp1->close(dbp1,0);
}

{
DB *dbp2=NULL;
ret = db_create(&dbp2, dbenv, 0);
int flags = DB_CREATE;
ret = dbp2->open(dbp2, NULL, "kingstock.db", "test2", DB_BTREE, flags, 0);
dbp2->close(dbp2,0);
}

dbenv->close(dbenv,0);
return 0;
}
posted on 2009-08-18 23:38 Diviner 阅读(2309) 评论(11)  编辑 收藏

Feedback

# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-08-18 23:44 Diviner
#include <sys/types.h>

#include <errno.h>
#include <iostream>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma comment(lib,"libdb47.lib")
#include <db.h>


int main(int argc,char *argv[])
{
DB_ENV *dbenv;
int ret = db_env_create(&dbenv, 0);
dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0);
ret = dbenv->open(dbenv, "d:\\test\\", DB_CREATE|DB_INIT_LOG| DB_INIT_MPOOL, 0);

{
DB *dbp1=NULL;
ret = db_create(&dbp1, dbenv, 0);
int flags = DB_CREATE;
ret = dbp1->open(dbp1, NULL, "kingstock.db", "test1", DB_BTREE, flags, 0);

for(int i=0;i<40960;i++)
{
DBT key, data;
memset(&key,0,sizeof(key));
memset(&data,0,sizeof(data));
key.data=&i;
key.size=4;

data.data=&i;
data.size=4;

dbp1->put(dbp1,NULL,&key,&data,NULL);
}

dbp1->close(dbp1,0);
}

{
DB *dbp2=NULL;
ret = db_create(&dbp2, dbenv, 0);
int flags = DB_CREATE;
ret = dbp2->open(dbp2, NULL, "kingstock.db", "test2", DB_BTREE, flags, 0);

for(int i=0;i<40960;i++)
{
DBT key, data;
memset(&key,0,sizeof(key));
memset(&data,0,sizeof(data));
key.data=&i;
key.size=4;

data.data=&i;
data.size=4;

dbp2->put(dbp2,NULL,&key,&data,NULL);
}

dbp2->close(dbp2,0);
}

dbenv->close(dbenv,0);
return 0;
}

# 下面是遍历,速度非常的快,我存几万条简单的记录基本上是瞬间完成。 2009-08-18 23:48 Diviner
int main(int argc,char *argv[])
{
DB_ENV *dbenv;
int ret = db_env_create(&dbenv, 0);
dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0);
ret = dbenv->open(dbenv, "d:\\test\\", DB_CREATE|DB_INIT_LOG| DB_INIT_MPOOL, 0);

{
DB *dbp1=NULL;
ret = db_create(&dbp1, dbenv, 0);
int flags = DB_CREATE;
ret = dbp1->open(dbp1, NULL, "kingstock.db", "test1", DB_BTREE, flags, 0);

DBC *cursorp;
DBT key, data;
dbp1->cursor(dbp1, NULL, &cursorp, 0);
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
while ((ret = cursorp->get(cursorp, &key, &data, DB_NEXT)) == 0)
{
int *pkey=(int *)key.data;
printf("Table 1:%d\n",*pkey);
}
cursorp->close(cursorp);


dbp1->close(dbp1,0);
}

{
DB *dbp2=NULL;
ret = db_create(&dbp2, dbenv, 0);
int flags = DB_CREATE;
ret = dbp2->open(dbp2, NULL, "kingstock.db", "test2", DB_BTREE, flags, 0);

DBC *cursorp;
DBT key, data;
dbp2->cursor(dbp2, NULL, &cursorp, 0);
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
while ((ret = cursorp->get(cursorp, &key, &data, DB_NEXT)) == 0)
{
int *pkey=(int *)key.data;
printf("Table 1:%d\n",*pkey);
}
cursorp->close(cursorp);

dbp2->close(dbp2,0);
}

dbenv->close(dbenv,0);
return 0;
}

# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-08-19 09:36 blog of vc_student
Berkeley DB :UNIX上的数据库?

# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-08-19 10:50 Diviner
很多平台上的数据库。

# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-08-19 12:18 demon
据他的文档上说,不用事务的情况下,这种小数据可以达到读写上w每秒。
后来实际测试时,ace+bdb做数据缓存服务器,用事务,复杂大数据(单条数据可以多到10K左右),总数据库大小为15G左右,每次都读取全新数据(缓存不能命中),以客户端发出请求和接收的速度来看,读是100多条每秒,写1000多条每秒。
从当时情况看,如果单进程的情况下使用,没有网络层的读写,解码和逻辑处理的的损耗,速度可能会高出很多。


# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-09-27 18:23 关中刀客
对了,那个日志不管的产生的问题,七猫兄怎么解决的呢?

# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-09-27 19:36 Diviner
什么日志不管?我不太理解?

# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-09-28 09:54 关中刀客
你运行一下你上面的程序,就会发现d:\\test\\目录下面很多的日志文件,每个都是10M,非常的多,写日志是影响BDB效率的事情,所以,
我们要不就可以完全的屏蔽掉日志,不要那个DB_INIT_LOG,不要可以使用checkpoint来删除不用的日志,这个需要调用相应的txn_checkpoint,但是我实验的时候没有成功,不知道为什么。


# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-09-28 14:26 关中刀客
并且,值得注意的是,使用这个环境和不使用的情况下,性能差距很大!

# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2009-09-28 16:25 Diviner
日志是不需要的。我自己用bdb都没有日志,而且我这个例子小有复杂,我一般就是一个db,不需要放多个db用。

void PacketDbLog::ensure_correct_db()
{
time_t nowtime=time(NULL);
tm *loctm=localtime(&nowtime);
int curday=loctm->tm_year*10000+loctm->tm_mon*100+loctm->tm_mday;
if(curday==dbDate)
return;

if(dbLog!=NULL)
{
dbLog->close(dbLog,0);
dbLog=NULL;
}

char timebuf[32];
strftime(timebuf,31,"\\szrb%Y%m%d.db",loctm);
char logfilepath[256]={0};
GetModuleFileName(NULL,logfilepath,256);
PathRemoveFileSpec(logfilepath);
strcat(logfilepath,timebuf);

int ret = db_create(&dbLog,NULL,0);
if (ret != 0)
{
dbLog=NULL;
return;
}
int flags = DB_CREATE;

ret = dbLog->open(dbLog,NULL,logfilepath,NULL,DB_RECNO,flags,0);
if (ret != 0)
{
dbLog=NULL;
}
dbDate=curday;
}

# re: Berkeley DB怎么在单个文件里创建多个表的例子。 2010-03-14 23:46 网站建设
收藏了

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]