实例代码

BTree读写

Db db(NULL,DB_CXX_NO_EXCEPTIONS);//环境指针

//事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略
if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)
{
	cout<<"同名数据库存在"<<endl;
}

//基本写
int  nKey=1;
char szBuf[100]="愚蠢的人类啊";
Dbt key,value;
key.set_data(&nKey);
key.set_size(4);
value.set_data(szBuf);
value.set_size(sizeof(szBuf));
if(db.put(NULL,&key,&value,0)!=0)
{
	cout<<"写入失败"<<endl;
}

//基本读
char szBufRead[100]={0};
Dbt readKey,readValue;
readKey.set_data(&nKey);
readKey.set_size(4);
readValue.set_data(szBufRead);
readValue.set_ulen(100);
readValue.set_flags(DB_DBT_USERMEM);
if(db.get(NULL,&readKey,&readValue,0)!=0)
{
	cout<<"读取失败"<<endl;
}

cout<<szBufRead<<endl;


 

Queue读写

Db db(NULL,DB_CXX_NO_EXCEPTIONS);//环境指针   

db.set_re_len(100);
db.set_re_pad(0);
  
//事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略   
if(db.open(NULL,"DB\\test.db",NULL,DB_QUEUE,DB_CREATE|DB_TRUNCATE,0)!=0)  
{  
	std::cout<<"同名数据库存在"<<std::endl;  
}  
  
//基本写 
char szBuf[100]="愚蠢的人类啊";  
int nkey=0;
Dbt key(&nkey,sizeof(nkey));
Dbt value;
value.set_data(szBuf);  
value.set_size(sizeof(szBuf));  
if(db.put(NULL,&key,&value,DB_APPEND)!=0)  
{  
	cout<<"写入失败"<<endl;  
}  
cout<<"返回的记录号为:"<<*((int*)key.get_data())<<endl;

游标基本读写删

Db db(NULL,DB_CXX_NO_EXCEPTIONS);//环境指针
//事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略   
if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
{  
	cout<<"同名数据库存在"<<endl;  
}  
  
//基本写   
int  nKey=1;  
char szBuf[100]="愚蠢的人类啊";  

Dbt key,value;  
key.set_data(&nKey);  
key.set_size(4);  
value.set_data(szBuf);  
value.set_size(sizeof(szBuf));  

for(int i=0;i<100;++i)
{
	nKey=i;
	if(db.put(NULL,&key,&value,0)!=0)  
	{  
		cout<<"写入失败"<<endl;  
	}  
}

//游标读
Dbc *p=0;
db.cursor(NULL,&p,0);
Dbt key1,value1;
while(p->get(&key1,&value1,DB_NEXT)==0)
{
	cout<<"键:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;
}
//备注:游标没有函数返回当前有多少个键

//查找
nKey=80;
key1.set_data(&nKey);
key1.set_size(sizeof(int));
p->get(&key1,&value1,DB_SET);
p->del(0);

//游标读
Dbc *p1=0;
db.cursor(NULL,&p1,0);
while(p1->get(&key1,&value1,DB_NEXT)==0)
{
	cout<<"键:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;
}

数据库支持重复记录

Db db(NULL,DB_CXX_NO_EXCEPTIONS);//环境指针   
  
	db.set_flags(DB_DUP);

	//事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略   
	if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
	{  
		cout<<"同名数据库存在"<<endl;  
	}  
  
	//基本写      
	int  nKey=1;    
	char szBuf[100]="愚蠢的人类啊";    
  
	Dbt key,value;    
	key.set_data(&nKey);    
	key.set_size(4);    
	value.set_data(szBuf);    
	value.set_size(sizeof(szBuf));    
  
	for(int i=0;i<5;++i)  
	{   
		if(db.put(NULL,&key,&value,0)!=0)    
		{    
			cout<<"写入失败"<<endl;    
		}    
	}  

	//游标读   
	Dbc *p=0;  
	db.cursor(NULL,&p,0);  
	Dbt key1,value1;  
	while(p->get(&key1,&value1,DB_NEXT)==0)  
	{  
		cout<<"键:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;  
	}  

基本环境操作

DbEnv evn(0);
if(evn.open("DB",DB_CREATE|DB_INIT_MPOOL,0)!=0)
{
	cout<<"打开环境错误"<<endl;
	return 0;
}
Db db(&evn,DB_CXX_NO_EXCEPTIONS);//环境指针   
 

//事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略   
if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
{  
	cout<<"同名数据库存在"<<endl;  
}  

游标的覆盖操作

Db db(NULL,DB_CXX_NO_EXCEPTIONS);
db.set_flags(DB_DUP);
if(db.open(NULL,"DB\\test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)
{
	cout<<"打开错误"<<endl;
	return 0;
}

int nkey=1;
char szBuf[100]="愚蠢的地球人";
Dbt key(&nkey,sizeof(int));
Dbt value(szBuf,strlen(szBuf));

for(int i=0;i<5;++i)
{
	db.put(NULL,&key,&value,0);
}

Dbc *currsor=0;
db.cursor(NULL,&currsor,0);

Dbt key1;
Dbt value1;
sprintf(szBuf,"愚蠢的火星人");
currsor->get(&key1,&value1,DB_FIRST);
currsor->get(&key1,&value1,DB_NEXT);
nkey=100;
if(currsor->put(&key,&value,DB_CURRENT)!=0)
{
	cout<<"put失败"<<endl;
}
currsor->get(&key1,&value1,DB_FIRST);
cout<<*((int *)key1.get_data())<<":"<<(char*)value1.get_data()<<endl;

while(currsor->get(&key1,&value1,DB_NEXT)==0)
{
	cout<<*((int *)key1.get_data())<<":"<<(char*)value1.get_data()<<endl;
}

二级数据库 没成功

struct Info
{
	char name[20];
	int  age;
};

int Fun(Db *pSecondary,const Dbt *key,const Dbt *value,Dbt *result)
{
	//result->set_flags(DB_DBT_APPMALLOC);
	Info *p=(Info *)value->get_data();
	result->set_data((void *)(p->age));
	result->set_size(sizeof(int));
	//result->set_ulen(4);
	return 0;
};

int _tmain(int argc, _TCHAR* argv[])
{
	Db dbPrimary(NULL,DB_CXX_NO_EXCEPTIONS);
	if(dbPrimary.open(NULL,"DB\\Primary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)
	{
		cout<<"打开错误"<<endl;
		return 0;
	}

	Dbt key,value;
	int nID=0;
	Info info;
	key.set_data(&nID);
	key.set_size(sizeof(int));
	value.set_data(&info);
	value.set_size(sizeof(Info));
	
	int nReturn=0;

	nID=100;
	sprintf(info.name,"张三");
	info.age=20;
	nReturn+=dbPrimary.put(NULL,&key,&value,0);

	nID=200;
	sprintf(info.name,"里斯");
	info.age=10;
	nReturn+=dbPrimary.put(NULL,&key,&value,0);

	nID=300;
	sprintf(info.name,"周杰伦");
	info.age=40;
	nReturn+=dbPrimary.put(NULL,&key,&value,0);

	if(nReturn!=0)
	{
		cout<<"出错啦"<<endl;
		return 0;
	}


	Db dbSecondary(NULL,DB_CXX_NO_EXCEPTIONS);
	if(dbSecondary.open(NULL,"DB\\Secondary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)
	{
		cout<<"打开错误"<<endl;
		return 0;
	}

	if(dbPrimary.associate(NULL,&dbSecondary,Fun,DB_CREATE)!=0)
	{
		cout<<"associate错误"<<endl;
		return 0;
	}


	/*Dbc *pCursor=0;
	if(dbSecondary.cursor(NULL,&pCursor,0)!=0)
	{
		cout<<"cursor创建错误"<<endl;
		return 0;
	}
	*/
	nID=100;
	if(dbSecondary.get(NULL,&key,&value,0)==0)
	{
		cout<<((Info *)value.get_data())->name<<endl;
	}


	/*Dbt key1;
	Dbt value1;

	nID=20;
	if(pCursor->get(&key1,&value1,DB_FIRST|DB_GET_BOTH)!=0)
	{
		if(pCursor->get(&key1,&value1,DB_FIRST)==DB_NOTFOUND)
			cout<<"没有元素"<<endl;
		cout<<"get错误"<<endl;
		return 0;
	}
	cout<<*((int *)key1.get_data())<<":"<<((Info *)value1.get_data())->name<<endl;
	while(pCursor->get(&key1,&value1,DB_NEXT)!=0)
	{
		cout<<*((int *)key1.get_data())<<":"<<(char *)value1.get_data()<<endl;
	}*/

	return 0;
}

部分写

Db dbPrimary(NULL,DB_CXX_NO_EXCEPTIONS);
if(dbPrimary.open(NULL,"DB\\Primary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)
{
	cout<<"打开错误"<<endl;
	return 0;
}

Dbt key,value;
int nID=0;
Info info;
key.set_data(&nID);
key.set_size(sizeof(int));
value.set_data(&info);
value.set_size(sizeof(Info));
	
int nReturn=0;

nID=100;
sprintf(info.name,"张三");
info.age=20;
nReturn+=dbPrimary.put(NULL,&key,&value,0);

nID=200;
sprintf(info.name,"里斯");
info.age=10;
nReturn+=dbPrimary.put(NULL,&key,&value,0);

nID=300;
sprintf(info.name,"周杰伦");
info.age=40;
nReturn+=dbPrimary.put(NULL,&key,&value,0);

if(nReturn!=0)
{
	cout<<"出错啦"<<endl;
	return 0;
}

nID=200;
char name[20]={"四"};
Dbt bt;
bt.set_flags(DB_DBT_PARTIAL);
bt.set_data(name);
bt.set_size(20);
bt.set_doff(0);
bt.set_dlen(20);
if(dbPrimary.put(NULL,&key,&bt,NULL)==0)
{
	cout<<"成功"<<endl;

	Dbc *pCursor=0;
	dbPrimary.cursor(NULL,&pCursor,0);

	Dbt key1,value1;
	while(pCursor->get(&key1,&value1,DB_NEXT)==0)
	{
		cout<<*((int *)(key1.get_data()))<<":"<<((Info *)(value1.get_data()))->name<<":"<<((Info *)(value1.get_data()))->age<<endl;
	}
}

事务

DbEnv env(0);
env.set_data_dir("Database");
env.set_lg_dir("Log");
//日志系统木默认是开启的
env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE,0);

Db dbPrimary(&env,DB_CXX_NO_EXCEPTIONS);

DbTxn *pTxn;
env.txn_begin(NULL,&pTxn,0);
if(dbPrimary.open(pTxn,"Primary.db",NULL,DB_BTREE,DB_CREATE,0)!=0)
{
	cout<<"打开错误"<<endl;
	return 0;
}
pTxn->commit(0);

Dbt key,value;
int nID=0;
Info info;
key.set_data(&nID);
key.set_size(sizeof(int));
value.set_data(&info);
value.set_size(sizeof(Info));
	
int nReturn=0;

nID=100;
sprintf(info.name,"张三");
info.age=20;

nReturn+=dbPrimary.put(NULL,&key,&value,0);


nID=200;
sprintf(info.name,"里斯");
info.age=10;

int ntime1=timeGetTime();

for(int i=0;i<1000000;++i)
{
	nID+=1;
	env.txn_begin(NULL,&pTxn,0);
	dbPrimary.put(pTxn,&key,&value,0);
	pTxn->abort();
}
int ntime2=timeGetTime();
cout<<ntime2-ntime1<<endl;

env.txn_begin(NULL,&pTxn,0);
nID=300;
sprintf(info.name,"周杰伦");
info.age=40;
nReturn+=dbPrimary.put(pTxn,&key,&value,0);
pTxn->abort();

if(nReturn!=0)
{
	cout<<"出错啦"<<endl;
	return 0;
}

Dbc *pCursor=0;
dbPrimary.cursor(NULL,&pCursor,0);

Dbt key1,value1;
while(pCursor->get(&key1,&value1,DB_NEXT)==0)
{
	cout<<*((int *)(key1.get_data()))<<":"<<((Info *)(value1.get_data()))->name<<":"<<((Info *)(value1.get_data()))->age<<endl;
}

最终方案

DbEnv env(0);
env.set_data_dir("Database");
env.set_lg_dir("Log");

env.set_cachesize(0,500*1024*1024,0);
env.log_set_config(DB_TXN_NOSYNC,1);
env.set_lg_bsize(300*1024*1024);


//日志系统木默认是开启的
env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE|DB_RECOVER,0);

//打开数据库
Db dbPrimary(&env,DB_CXX_NO_EXCEPTIONS);
DbTxn *pTxn;
env.txn_begin(NULL,&pTxn,0);
if(dbPrimary.open(pTxn,"Primary.db",NULL,DB_BTREE,DB_CREATE,0)!=0)
{
	cout<<"打开错误"<<endl;
	return 0;
}
pTxn->commit(0);

Dbt key,value;
int nID=0;
Info info;
key.set_data(&nID);
key.set_size(sizeof(int));
value.set_data(&info);
value.set_size(sizeof(Info));
	
nID=200;
sprintf(info.name,"里斯");
info.age=10;

int ntime1=timeGetTime(); 
env.txn_begin(NULL,&pTxn,0);
for(int i=0;i<20000;++i)
{
	nID+=1;
	dbPrimary.put(pTxn,&key,&value,0);
}
pTxn->commit(0);
int ntime2=timeGetTime();  
cout<<(ntime2-ntime1)/1000<<endl; 
system("pause");

一些配置

DbEnv env(0);
	env.set_data_dir("Database");
	env.set_lg_dir("Log");

	env.set_cachesize(0,500*1024*1024,0);
	env.log_set_config(DB_TXN_NOSYNC,1);
	env.set_lg_bsize(300*1024*1024);
	//db_env->set_lg_max()

	//日志系统木默认是开启的
	env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE|DB_RECOVER,0);
	env.set_flags(DB_HOTBACKUP_IN_PROGRESS,1);
	env.txn_checkpoint(0,0,DB_FORCE);
	env.log_archive(NULL,DB_ARCH_REMOVE);
	env.log_set_config(DB_LOG_AUTO_REMOVE,1);
	env.txn_checkpoint(0,0,DB_FORCE); 

复制

//Master
DbEnv env(0);
env.set_data_dir("Database");
env.set_lg_dir("Log");

env.set_cachesize(0,300*1024*1024,0);
env.log_set_config(DB_TXN_NOSYNC,1);
env.set_lg_bsize(300*1024*1024);
//db_env->set_lg_max()


DbSite *p;
env.repmgr_site("192.168.1.182",6000,&p,0);
p->set_config(DB_LOCAL_SITE,1);
p->set_config(DB_GROUP_CREATOR,1);
p->close();
env.rep_set_priority(100);
env.repmgr_set_ack_policy(DB_REPMGR_ACKS_NONE);

env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE|DB_RECOVER|DB_INIT_REP|DB_THREAD,0);
env.set_flags(DB_HOTBACKUP_IN_PROGRESS,1);

env.repmgr_start(3,DB_REP_MASTER);

//打开数据库
Db dbPrimary(&env,DB_CXX_NO_EXCEPTIONS);
DbTxn *pTxn;
env.txn_begin(NULL,&pTxn,0);
if(dbPrimary.open(pTxn,"Primary.db",NULL,DB_BTREE,DB_CREATE,0)!=0)
{
	cout<<"打开错误"<<endl;
	return 0;
}
pTxn->commit(0);

Dbt key,value;
int nID=0;
Info info;
key.set_data(&nID);
key.set_size(sizeof(int));
value.set_data(&info);
value.set_size(sizeof(Info));
	
nID=100;
sprintf(info.name,"里斯");
info.age=10;

int ntime1=timeGetTime(); 
for(int j=0;j<10000;++j)
{
	for(int i=0;i<10000;++i)
	{
		env.txn_begin(NULL,&pTxn,0);
		nID+=1;
		dbPrimary.put(pTxn,&key,&value,0);
		pTxn->commit(0);
	}
	cout<<"插入"<<nID<<endl;
}
int ntime2=timeGetTime();  
cout<<(ntime2-ntime1)/1000<<endl; 

Dbc *pCursor=0;
dbPrimary.cursor(NULL,&pCursor,0);
Dbt key1,value1;

pCursor->get(&key1,&value1,DB_LAST);
cout<<*((int *)(key1.get_data()))<<":"<<((Info *)(value1.get_data()))->name<<":"<<((Info *)(value1.get_data()))->age<<endl;

/*while(pCursor->get(&key1,&value1,DB_NEXT)==0)
{
	cout<<*((int *)(key1.get_data()))<<":"<<((Info *)(value1.get_data()))->name<<":"<<((Info *)(value1.get_data()))->age<<endl;
}*/

//end Master---------------------------------------------


//参与者
DbEnv env(0);

env.set_data_dir("Database");
env.set_lg_dir("Log");

env.set_cachesize(0,300*1024*1024,0);
env.log_set_config(DB_TXN_NOSYNC,1);
env.set_lg_bsize(300*1024*1024);


DbSite *p;
env.repmgr_site("127.0.0.1",5000,&p,0);
p->set_config(DB_LOCAL_SITE,1);
p->close();
env.rep_set_priority(100);

DbSite *pOther;
env.repmgr_site("192.168.1.182",6000,&pOther,0);
pOther->set_config(DB_BOOTSTRAP_HELPER,1);
pOther->close();

env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE|DB_RECOVER|DB_INIT_REP|DB_THREAD,0);
env.set_flags(DB_HOTBACKUP_IN_PROGRESS,1);

int a=env.repmgr_start(3,DB_REP_CLIENT);

while(true)
{
	Sleep(1000);
}


 




 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值