程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 學習Berkeley DB

學習Berkeley DB

編輯:關於C語言

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()函數來完成的,其原型如下所示:

?

參數“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/


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

本文出自 “colin” 博客,請務必保留此出處http://me115.blog.51cto.com/86104/1298134

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved