首先,我們要了解Berkeley DB的一些基本特性,在IBM的開發網站上有篇文章對其有比較清晰的介紹;
這篇文章講到了BDB的設計思想和核心數據結構、以及數據訪問算法;並有常用函數使用范例;算是接觸BDB的一個入門好材料;
進入以下url閱讀:
http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html
我現在的問題是,我們需要使用BDB的話,有以下問題需要解決:
如何使用各個常用操作?
數據訪問算法的選擇?
性能如何?需要做一個貼近實際的性能測試;
BDB支持多索引,那麼多索引是如何建立的?
針對特定環境,如何建立合適的索引?
如何封裝,以便於我們方便的使用?
如何將SQL移植為NOSQL?
在接下來的學習中,我將集中解決以上問題;
在這篇文章中,我們學習BDB的常用操作。
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
首先調用db_create()函數來創建DB 結構的一個實例,然後再調用DB->open()函數來完成真正的打開操作。
Berkeley DB 將所有對數據庫的操作都封裝在名為DB 的結構中。db_create()函數的作用就是創建一個該結構。
將磁盤上保存的文件作為數據庫打開是由DB->open()函數來完成的,其原型如下所示:
?參數“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);
刪除數據只需給出相應的關鍵字,不用指明與之對應的數據。
?對於一次完整的數據庫操作過程來說,關閉數據庫是不可或缺的一個 節。這是因為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/
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
本文出自 “colin” 博客,請務必保留此出處http://me115.blog.51cto.com/86104/1298134