[轉]BDB例項程式碼

weixin_34015860發表於2011-12-16

BTree讀寫

  1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);//環境指標  
  2.   
  3. //事務指標,資料庫類別,訪問標誌(建立,只讀,自動提交事務,執行緒安全),mode在windows中忽略  
  4. if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
  5. {  
  6.     cout<<"同名資料庫存在"<<endl;  
  7. }  
  8.   
  9. //基本寫  
  10. int  nKey=1;  
  11. char szBuf[100]="愚蠢的人類啊";  
  12. Dbt key,value;  
  13. key.set_data(&nKey);  
  14. key.set_size(4);  
  15. value.set_data(szBuf);  
  16. value.set_size(sizeof(szBuf));  
  17. if(db.put(NULL,&key,&value,0)!=0)  
  18. {  
  19.     cout<<"寫入失敗"<<endl;  
  20. }  
  21.   
  22. //基本讀  
  23. char szBufRead[100]={0};  
  24. Dbt readKey,readValue;  
  25. readKey.set_data(&nKey);  
  26. readKey.set_size(4);  
  27. readValue.set_data(szBufRead);  
  28. readValue.set_ulen(100);  
  29. readValue.set_flags(DB_DBT_USERMEM);  
  30. if(db.get(NULL,&readKey,&readValue,0)!=0)  
  31. {  
  32.     cout<<"讀取失敗"<<endl;  
  33. }  
  34.   
  35. cout<<szBufRead<<endl;  


 

Queue讀寫

  1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);//環境指標     
  2.   
  3. db.set_re_len(100);  
  4. db.set_re_pad(0);  
  5.     
  6. //事務指標,資料庫類別,訪問標誌(建立,只讀,自動提交事務,執行緒安全),mode在windows中忽略     
  7. if(db.open(NULL,"DB\\test.db",NULL,DB_QUEUE,DB_CREATE|DB_TRUNCATE,0)!=0)    
  8. {    
  9.     std::cout<<"同名資料庫存在"<<std::endl;    
  10. }    
  11.     
  12. //基本寫   
  13. char szBuf[100]="愚蠢的人類啊";    
  14. int nkey=0;  
  15. Dbt key(&nkey,sizeof(nkey));  
  16. Dbt value;  
  17. value.set_data(szBuf);    
  18. value.set_size(sizeof(szBuf));    
  19. if(db.put(NULL,&key,&value,DB_APPEND)!=0)    
  20. {    
  21.     cout<<"寫入失敗"<<endl;    
  22. }    
  23. cout<<"返回的記錄號為:"<<*((int*)key.get_data())<<endl;  

遊標基本讀寫刪

  1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);//環境指標  
  2. //事務指標,資料庫類別,訪問標誌(建立,只讀,自動提交事務,執行緒安全),mode在windows中忽略     
  3. if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)    
  4. {    
  5.     cout<<"同名資料庫存在"<<endl;    
  6. }    
  7.     
  8. //基本寫     
  9. int  nKey=1;    
  10. char szBuf[100]="愚蠢的人類啊";    
  11.   
  12. Dbt key,value;    
  13. key.set_data(&nKey);    
  14. key.set_size(4);    
  15. value.set_data(szBuf);    
  16. value.set_size(sizeof(szBuf));    
  17.   
  18. for(int i=0;i<100;++i)  
  19. {  
  20.     nKey=i;  
  21.     if(db.put(NULL,&key,&value,0)!=0)    
  22.     {    
  23.         cout<<"寫入失敗"<<endl;    
  24.     }    
  25. }  
  26.   
  27. //遊標讀  
  28. Dbc *p=0;  
  29. db.cursor(NULL,&p,0);  
  30. Dbt key1,value1;  
  31. while(p->get(&key1,&value1,DB_NEXT)==0)  
  32. {  
  33.     cout<<"鍵:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;  
  34. }  
  35. //備註:遊標沒有函式返回當前有多少個鍵  
  36.   
  37. //查詢  
  38. nKey=80;  
  39. key1.set_data(&nKey);  
  40. key1.set_size(sizeof(int));  
  41. p->get(&key1,&value1,DB_SET);  
  42. p->del(0);  
  43.   
  44. //遊標讀  
  45. Dbc *p1=0;  
  46. db.cursor(NULL,&p1,0);  
  47. while(p1->get(&key1,&value1,DB_NEXT)==0)  
  48. {  
  49.     cout<<"鍵:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;  
  50. }  

資料庫支援重複記錄

  1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);//環境指標     
  2.     
  3.     db.set_flags(DB_DUP);  
  4.   
  5.     //事務指標,資料庫類別,訪問標誌(建立,只讀,自動提交事務,執行緒安全),mode在windows中忽略     
  6.     if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)    
  7.     {    
  8.         cout<<"同名資料庫存在"<<endl;    
  9.     }    
  10.     
  11.     //基本寫        
  12.     int  nKey=1;      
  13.     char szBuf[100]="愚蠢的人類啊";      
  14.     
  15.     Dbt key,value;      
  16.     key.set_data(&nKey);      
  17.     key.set_size(4);      
  18.     value.set_data(szBuf);      
  19.     value.set_size(sizeof(szBuf));      
  20.     
  21.     for(int i=0;i<5;++i)    
  22.     {     
  23.         if(db.put(NULL,&key,&value,0)!=0)      
  24.         {      
  25.             cout<<"寫入失敗"<<endl;      
  26.         }      
  27.     }    
  28.   
  29.     //遊標讀     
  30.     Dbc *p=0;    
  31.     db.cursor(NULL,&p,0);    
  32.     Dbt key1,value1;    
  33.     while(p->get(&key1,&value1,DB_NEXT)==0)    
  34.     {    
  35.         cout<<"鍵:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;    
  36.     }    

基本環境操作

  1. DbEnv evn(0);  
  2. if(evn.open("DB",DB_CREATE|DB_INIT_MPOOL,0)!=0)  
  3. {  
  4.     cout<<"開啟環境錯誤"<<endl;  
  5.     return 0;  
  6. }  
  7. Db db(&evn,DB_CXX_NO_EXCEPTIONS);//環境指標     
  8.    
  9.   
  10. //事務指標,資料庫類別,訪問標誌(建立,只讀,自動提交事務,執行緒安全),mode在windows中忽略     
  11. if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)    
  12. {    
  13.     cout<<"同名資料庫存在"<<endl;    
  14. }    

遊標的覆蓋操作

  1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);  
  2. db.set_flags(DB_DUP);  
  3. if(db.open(NULL,"DB\\test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
  4. {  
  5.     cout<<"開啟錯誤"<<endl;  
  6.     return 0;  
  7. }  
  8.   
  9. int nkey=1;  
  10. char szBuf[100]="愚蠢的地球人";  
  11. Dbt key(&nkey,sizeof(int));  
  12. Dbt value(szBuf,strlen(szBuf));  
  13.   
  14. for(int i=0;i<5;++i)  
  15. {  
  16.     db.put(NULL,&key,&value,0);  
  17. }  
  18.   
  19. Dbc *currsor=0;  
  20. db.cursor(NULL,&currsor,0);  
  21.   
  22. Dbt key1;  
  23. Dbt value1;  
  24. sprintf(szBuf,"愚蠢的火星人");  
  25. currsor->get(&key1,&value1,DB_FIRST);  
  26. currsor->get(&key1,&value1,DB_NEXT);  
  27. nkey=100;  
  28. if(currsor->put(&key,&value,DB_CURRENT)!=0)  
  29. {  
  30.     cout<<"put失敗"<<endl;  
  31. }  
  32. currsor->get(&key1,&value1,DB_FIRST);  
  33. cout<<*((int *)key1.get_data())<<":"<<(char*)value1.get_data()<<endl;  
  34.   
  35. while(currsor->get(&key1,&value1,DB_NEXT)==0)  
  36. {  
  37.     cout<<*((int *)key1.get_data())<<":"<<(char*)value1.get_data()<<endl;  
  38. }  

二級資料庫 沒成功

  1. struct Info  
  2. {  
  3.     char name[20];  
  4.     int  age;  
  5. };  
  6.   
  7. int Fun(Db *pSecondary,const Dbt *key,const Dbt *value,Dbt *result)  
  8. {  
  9.     //result->set_flags(DB_DBT_APPMALLOC);  
  10.     Info *p=(Info *)value->get_data();  
  11.     result->set_data((void *)(p->age));  
  12.     result->set_size(sizeof(int));  
  13.     //result->set_ulen(4);  
  14.     return 0;  
  15. };  
  16.   
  17. int _tmain(int argc, _TCHAR* argv[])  
  18. {  
  19.     Db dbPrimary(NULL,DB_CXX_NO_EXCEPTIONS);  
  20.     if(dbPrimary.open(NULL,"DB\\Primary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
  21.     {  
  22.         cout<<"開啟錯誤"<<endl;  
  23.         return 0;  
  24.     }  
  25.   
  26.     Dbt key,value;  
  27.     int nID=0;  
  28.     Info info;  
  29.     key.set_data(&nID);  
  30.     key.set_size(sizeof(int));  
  31.     value.set_data(&info);  
  32.     value.set_size(sizeof(Info));  
  33.       
  34.     int nReturn=0;  
  35.   
  36.     nID=100;  
  37.     sprintf(info.name,"張三");  
  38.     info.age=20;  
  39.     nReturn+=dbPrimary.put(NULL,&key,&value,0);  
  40.   
  41.     nID=200;  
  42.     sprintf(info.name,"里斯");  
  43.     info.age=10;  
  44.     nReturn+=dbPrimary.put(NULL,&key,&value,0);  
  45.   
  46.     nID=300;  
  47.     sprintf(info.name,"周杰倫");  
  48.     info.age=40;  
  49.     nReturn+=dbPrimary.put(NULL,&key,&value,0);  
  50.   
  51.     if(nReturn!=0)  
  52.     {  
  53.         cout<<"出錯啦"<<endl;  
  54.         return 0;  
  55.     }  
  56.   
  57.   
  58.     Db dbSecondary(NULL,DB_CXX_NO_EXCEPTIONS);  
  59.     if(dbSecondary.open(NULL,"DB\\Secondary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
  60.     {  
  61.         cout<<"開啟錯誤"<<endl;  
  62.         return 0;  
  63.     }  
  64.   
  65.     if(dbPrimary.associate(NULL,&dbSecondary,Fun,DB_CREATE)!=0)  
  66.     {  
  67.         cout<<"associate錯誤"<<endl;  
  68.         return 0;  
  69.     }  
  70.   
  71.   
  72.     /*Dbc *pCursor=0; 
  73.     if(dbSecondary.cursor(NULL,&pCursor,0)!=0) 
  74.     { 
  75.         cout<<"cursor建立錯誤"<<endl; 
  76.         return 0; 
  77.     } 
  78.     */  
  79.     nID=100;  
  80.     if(dbSecondary.get(NULL,&key,&value,0)==0)  
  81.     {  
  82.         cout<<((Info *)value.get_data())->name<<endl;  
  83.     }  
  84.   
  85.   
  86.     /*Dbt key1; 
  87.     Dbt value1; 
  88.  
  89.     nID=20; 
  90.     if(pCursor->get(&key1,&value1,DB_FIRST|DB_GET_BOTH)!=0) 
  91.     { 
  92.         if(pCursor->get(&key1,&value1,DB_FIRST)==DB_NOTFOUND) 
  93.             cout<<"沒有元素"<<endl; 
  94.         cout<<"get錯誤"<<endl; 
  95.         return 0; 
  96.     } 
  97.     cout<<*((int *)key1.get_data())<<":"<<((Info *)value1.get_data())->name<<endl; 
  98.     while(pCursor->get(&key1,&value1,DB_NEXT)!=0) 
  99.     { 
  100.         cout<<*((int *)key1.get_data())<<":"<<(char *)value1.get_data()<<endl; 
  101.     }*/  
  102.   
  103.     return 0;  
  104. }  

部分寫

  1. Db dbPrimary(NULL,DB_CXX_NO_EXCEPTIONS);  
  2. if(dbPrimary.open(NULL,"DB\\Primary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
  3. {  
  4.     cout<<"開啟錯誤"<<endl;  
  5.     return 0;  
  6. }  
  7.   
  8. Dbt key,value;  
  9. int nID=0;  
  10. Info info;  
  11. key.set_data(&nID);  
  12. key.set_size(sizeof(int));  
  13. value.set_data(&info);  
  14. value.set_size(sizeof(Info));  
  15.       
  16. int nReturn=0;  
  17.   
  18. nID=100;  
  19. sprintf(info.name,"張三");  
  20. info.age=20;  
  21. nReturn+=dbPrimary.put(NULL,&key,&value,0);  
  22.   
  23. nID=200;  
  24. sprintf(info.name,"里斯");  
  25. info.age=10;  
  26. nReturn+=dbPrimary.put(NULL,&key,&value,0);  
  27.   
  28. nID=300;  
  29. sprintf(info.name,"周杰倫");  
  30. info.age=40;  
  31. nReturn+=dbPrimary.put(NULL,&key,&value,0);  
  32.   
  33. if(nReturn!=0)  
  34. {  
  35.     cout<<"出錯啦"<<endl;  
  36.     return 0;  
  37. }  
  38.   
  39. nID=200;  
  40. char name[20]={"四"};  
  41. Dbt bt;  
  42. bt.set_flags(DB_DBT_PARTIAL);  
  43. bt.set_data(name);  
  44. bt.set_size(20);  
  45. bt.set_doff(0);  
  46. bt.set_dlen(20);  
  47. if(dbPrimary.put(NULL,&key,&bt,NULL)==0)  
  48. {  
  49.     cout<<"成功"<<endl;  
  50.   
  51.     Dbc *pCursor=0;  
  52.     dbPrimary.cursor(NULL,&pCursor,0);  
  53.   
  54.     Dbt key1,value1;  
  55.     while(pCursor->get(&key1,&value1,DB_NEXT)==0)  
  56.     {  
  57.         cout<<*((int *)(key1.get_data()))<<":"<<((Info *)(value1.get_data()))->name<<":"<<((Info *)(value1.get_data()))->age<<endl;  
  58.     }  
  59. }  

事務

  1. DbEnv env(0);  
  2. env.set_data_dir("Database");  
  3. env.set_lg_dir("Log");  
  4. //日誌系統木預設是開啟的  
  5. env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE,0);  
  6.   
  7. Db dbPrimary(&env,DB_CXX_NO_EXCEPTIONS);  
  8.   
  9. DbTxn *pTxn;  
  10. env.txn_begin(NULL,&pTxn,0);  
  11. if(dbPrimary.open(pTxn,"Primary.db",NULL,DB_BTREE,DB_CREATE,0)!=0)  
  12. {  
  13.     cout<<"開啟錯誤"<<endl;  
  14.     return 0;  
  15. }  
  16. pTxn->commit(0);  
  17.   
  18. Dbt key,value;  
  19. int nID=0;  
  20. Info info;  
  21. key.set_data(&nID);  
  22. key.set_size(sizeof(int));  
  23. value.set_data(&info);  
  24. value.set_size(sizeof(Info));  
  25.       
  26. int nReturn=0;  
  27.   
  28. nID=100;  
  29. sprintf(info.name,"張三");  
  30. info.age=20;  
  31.   
  32. nReturn+=dbPrimary.put(NULL,&key,&value,0);  
  33.   
  34.   
  35. nID=200;  
  36. sprintf(info.name,"里斯");  
  37. info.age=10;  
  38.   
  39. int ntime1=timeGetTime();  
  40.   
  41. for(int i=0;i<1000000;++i)  
  42. {  
  43.     nID+=1;  
  44.     env.txn_begin(NULL,&pTxn,0);  
  45.     dbPrimary.put(pTxn,&key,&value,0);  
  46.     pTxn->abort();  
  47. }  
  48. int ntime2=timeGetTime();  
  49. cout<<ntime2-ntime1<<endl;  
  50.   
  51. env.txn_begin(NULL,&pTxn,0);  
  52. nID=300;  
  53. sprintf(info.name,"周杰倫");  
  54. info.age=40;  
  55. nReturn+=dbPrimary.put(pTxn,&key,&value,0);  
  56. pTxn->abort();  
  57.   
  58. if(nReturn!=0)  
  59. {  
  60.     cout<<"出錯啦"<<endl;  
  61.     return 0;  
  62. }  
  63.   
  64. Dbc *pCursor=0;  
  65. dbPrimary.cursor(NULL,&pCursor,0);  
  66.   
  67. Dbt key1,value1;  
  68. while(pCursor->get(&key1,&value1,DB_NEXT)==0)  
  69. {  
  70.     cout<<*((int *)(key1.get_data()))<<":"<<((Info *)(value1.get_data()))->name<<":"<<((Info *)(value1.get_data()))->age<<endl;  
  71. }  

最終方案

  1. DbEnv env(0);  
  2. env.set_data_dir("Database");  
  3. env.set_lg_dir("Log");  
  4.   
  5. env.set_cachesize(0,500*1024*1024,0);  
  6. env.log_set_config(DB_TXN_NOSYNC,1);  
  7. env.set_lg_bsize(300*1024*1024);  
  8.   
  9.   
  10. //日誌系統木預設是開啟的  
  11. env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE|DB_RECOVER,0);  
  12.   
  13. //開啟資料庫  
  14. Db dbPrimary(&env,DB_CXX_NO_EXCEPTIONS);  
  15. DbTxn *pTxn;  
  16. env.txn_begin(NULL,&pTxn,0);  
  17. if(dbPrimary.open(pTxn,"Primary.db",NULL,DB_BTREE,DB_CREATE,0)!=0)  
  18. {  
  19.     cout<<"開啟錯誤"<<endl;  
  20.     return 0;  
  21. }  
  22. pTxn->commit(0);  
  23.   
  24. Dbt key,value;  
  25. int nID=0;  
  26. Info info;  
  27. key.set_data(&nID);  
  28. key.set_size(sizeof(int));  
  29. value.set_data(&info);  
  30. value.set_size(sizeof(Info));  
  31.       
  32. nID=200;  
  33. sprintf(info.name,"里斯");  
  34. info.age=10;  
  35.   
  36. int ntime1=timeGetTime();   
  37. env.txn_begin(NULL,&pTxn,0);  
  38. for(int i=0;i<20000;++i)  
  39. {  
  40.     nID+=1;  
  41.     dbPrimary.put(pTxn,&key,&value,0);  
  42. }  
  43. pTxn->commit(0);  
  44. int ntime2=timeGetTime();    
  45. cout<<(ntime2-ntime1)/1000<<endl;   
  46. system("pause");  

一些配置

  1. DbEnv env(0);  
  2.     env.set_data_dir("Database");  
  3.     env.set_lg_dir("Log");  
  4.   
  5.     env.set_cachesize(0,500*1024*1024,0);  
  6.     env.log_set_config(DB_TXN_NOSYNC,1);  
  7.     env.set_lg_bsize(300*1024*1024);  
  8.     //db_env->set_lg_max()  
  9.   
  10.     //日誌系統木預設是開啟的  
  11.     env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE|DB_RECOVER,0);  
  12.     env.set_flags(DB_HOTBACKUP_IN_PROGRESS,1);  
  13.     env.txn_checkpoint(0,0,DB_FORCE);  
  14.     env.log_archive(NULL,DB_ARCH_REMOVE);  
  15.     env.log_set_config(DB_LOG_AUTO_REMOVE,1);  
  16.     env.txn_checkpoint(0,0,DB_FORCE);   





 



相關文章