學習Berkeley DB- 入門


1 導言

首先,我們要了解Berkeley DB的一些基本特性,在IBM的開發網站上有篇文章對其有比較清晰的介紹;

這篇文章講到了BDB的設計思想和核心數據結構、以及數據訪問算法;並有常用函數使用范例;算是接觸BDB的一個入門好材料;

進入以下url閱讀:

http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html

 

我現在的問題是,我們需要使用BDB的話,有以下問題需要解決:

如何使用各個常用操作?

數據訪問算法的選擇?

性能如何?需要做一個貼近實際的性能測試;

BDB支持多索引,那么多索引是如何建立的?

針對特定環境,如何建立合適的索引?

如何封裝,以便於我們方便的使用?

如何將SQL移植為NOSQL?

在接下來的學習中,我將集中解決以上問題;

在這篇文章中,我們學習BDB的常用操作。

  

2 下載安裝 

Berkeley DB下載

oracle Berkeley DB官網:

http://www.oracle.com/us/products/database/berkeley-db/overview/index.html

http://www.oracle.com/technetwork/products/berkeleydb/downloads/index.html?ssSourceSiteId=ocomen

下載版本:Berkeley DB 6.0.20.tar.gz

安裝

進入對應環境的安裝目錄:

cd build_unix

../dist/configure --prefix=/opt/app/todeav1/soft/bdb/

環境變量部署

BDB_HOME=/opt/app/todeav1/colin/db;export BDB_HOME

LIBPATH=$BDB_HOME/bin:$LIBPATH; export LIBPATH

LD_LIBRARY_PATH=$BDB_HOME/lib:$LD_LIBRARY_PATH;export LD_LIBRARY_PATH

編譯

g++ -o test demo.cpp -I$BDB_HOME/include/ -L$BDB_HOME/lib/ -ldb –lpthread

 

3 常用操作

打開數據庫

首先調用db_create()函數來創建DB 結構的一個實例,然后再調用DB->open()函數來完成真正的打開操作。

Berkeley DB 將所有對數據庫的操作都封裝在名為DB 的結構中。db_create()函數的作用就是創建一個該結構。

將磁盤上保存的文件作為數據庫打開是由DB->open()函數來完成的,其原型如下所示:

int DB->open(DB *db, DB_TXN *txnid, const char *file, 
                    const char *database, DBTYPE type, u_int32_t flags, int mode); 
eg:
if ((ret = db_create(&dbp, NULL, 0)) != 0) { 
     fprintf(stderr, "db_create: %s\n", 
    db_strerror(ret)); 
    exit (1); 
 } 

 if ((ret = dbp->open(dbp, NULL, DATABASE, NULL, 
     DB_BTREE, DB_CREATE, 0664)) != 0) { 
    dbp->err(dbp, ret, "%s", DATABASE); 
    exit (1); 
 } 

參數“DATABASE”指明對應的磁盤文件名為demo.db;參數“DB_BTREE”表示數據庫底層使用的數據結構是B 樹;而參數“DB_CREATE”和“0664”則表明當數據庫文件不存在時創建一個新的數據庫文件,並且將該文件的屬性值設置為0664。

錯誤處理是在打開數據庫時必須的例行檢查,這可以通過調用DB->err()函數來完成。其中 參數“ret”是在調用Berkeley DB 函數后返回的錯誤代碼,其余參數則用於顯示結構化的錯 誤信息。

插入

向Berkeley DB 數據庫中添加數據可以通過調用DB->put()函數來完成,其原型如下所示:

int DB->put(DB *db, DB_TXN *txnid, DBT *key, DBT *data,

                            u_int32_t flags);

在向數據庫中添加數據時,如果給定的關鍵字已經存在,大多數應用會對於已經存在的數據。

采用覆蓋原則。也就是說,如果數據庫中已經保存了一個“sport/basketball”對,再次調用DB->put()函數添加一個“sport/football”對,那么先前保存的那些數據將會被覆蓋。但Berkeley DB 允許在調用DB->put()函數時指定參數“DB_NOOVERWRITE”,聲明不對數據庫中已經存在的數據進行覆蓋,一旦給出“DB_NOOVERWRITE”標記,如果DB->put()函數在執行過程中發現給出的關鍵字在數據庫中已經存在了,就無法成功地把該Key/Data 對添加到數據庫中,於是將返回錯誤代碼 “DB_KEYEXIST”。

檢索數據

從Berkeley DB 數據庫中檢索數據可以通過調用DB->get()函數來完成,其原型如下所示:

int DB->get(DB *db, DB_TXN *txnid, DBT *key, DBT *data,

                            u_int32_t flags);

在進行數據檢索時,對DB->get()函數的返回值進行處理是必不可少的,因為它攜帶着檢索操作是否成功完成等信息。下面列出的是DB->get()函數的返回值:

◆0   函數調用成功,指定的關鍵字被找到;

◆DB_NOTFOUND        函數調用成功,但指定的關鍵字未被找到;

◆大於0     函數調用失敗,可能出現了系統錯誤。

刪除

從Berkeley DB 數據庫中刪除數據可以通過調用DB->del()函數來完成,其原型如下所示:

int DB->del(DB *db, DB_TXN *txnid, DBT *key, u_int32_t flags);

刪除數據只需給出相應的關鍵字,不用指明與之對應的數據。

eg:
key.data = "sport"; 
key.size = sizeof("sport"); 
if ((ret = dbp->del(dbp, NULL, &key, 0)) == 0) 
printf("db: %s: key was deleted.\n", (char*)key.data); 
else 
dbp->err(dbp, ret, "DB->del"); 

關閉數據庫

對於一次完整的數據庫操作過程來說,關閉數據庫是不可或缺的一個 節。這是因為Berkeley DB 需要依賴於系統底層的緩沖機制,也就是說只有在數據庫正常關閉的時候,修改后的數據才有可能全部寫到磁盤上,同時它所占用的資源也才能真正被全部釋放。關閉數據庫的操作是通過調用DB->close()函數來完成的,其原型如下所示:

int DB->close(DB *db, u_int32_t flags);

刷新緩存到硬盤

Berkeley DB的所有操作都是在內存中進行,在關閉數據庫句柄時,會將所有數據寫入到硬盤中;在程序運行中,如需要同步數據到硬盤,可調用sync()函數:

注:這個函數在4.3之前的版本是無參的,而在之后的版本增加參數,修改之前的例子需注意兼容;

dbp->sync(dbp,0);

更多

這篇文章對插入時每個操作有個詳細的說明,並給出了進一步學習的文檔link;

Berkeley DB示例程序詳解 (1)

http://www.bdbchina.com/2009/02/berkeley-db%E7%A4%BA%E4%BE%8B%E7%A8%8B%E5%BA%8F%E8%AF%A6%E8%A7%A3-1/

 

 

4 更多學習資料

Berkeley DB 官方開發者文檔

http://docs.oracle.com/cd/E17076_03/html/index.html

官方主頁:http://www.oracle.com/database/berkeley-db/db/index.html

產品下載:http://www.oracle.com/technology/software/products/berkeley-db/index.html

Berkeley DB中國研發團隊博客:

http://www.bdbchina.com/

文檔中心:http://www.oracle.com/technology/documentation/berkeley-db/db/index.html

Berkeley DB官方論壇(貌似已經無人維護):

https://forums.oracle.com/community/developer/english/berkeley_db_family

 

 

Posted by: 大CC | 17SEP,2013

博客:blog.me115.com

微博:新浪微博

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM