首先,我們要了解berkeley db的一些基本特性,在ibm的開發**上有篇文章對其有比較清晰的介紹;
這篇文章講到了bdb的設計思想和核心資料結構、以及資料訪問演算法;並有常用函式使用範例;算是接觸bdb的乙個入門好材料;
進入以下url閱讀:
我現在的問題是,我們需要使用bdb的話,有以下問題需要解決:
如何使用各個常用操作?
資料訪問演算法的選擇?
效能如何?需要做乙個貼近實際的效能測試;
bdb支援多索引,那麼多索引是如何建立的?
針對特定環境,如何建立合適的索引?
如何封裝,以便於我們方便的使用?
如何將sql移植為nosql?
在接下來的學習中,我將集中解決以上問題;
在這篇文章中,我們學習bdb的常用操作。
oracle berkeley db官網:
進入對應環境的安裝目錄:
cd build_unix
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()函式來完成的,其原型如下所示:
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)
if ((ret = dbp->open(dbp, null, database, null,
db_btree, db_create, 0664)) != 0)
引數「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)
berkeley db 官方開發者文件
官方主頁:
berkeley db中國研發團隊部落格:
文件中心:
berkeley db官方論壇(貌似已經無人維護):
posted by: 大cc | 17sep,2013
部落格:blog.me115.com
微博:
學習Berkeley DB 入門
首先,我們要了解berkeley db的一些基本特性,在ibm的開發 上有篇文章對其有比較清晰的介紹 這篇文章講到了bdb的設計思想和核心資料結構 以及資料訪問演算法 並有常用函式使用範例 算是接觸bdb的乙個入門好材料 進入以下url閱讀 我現在的問題是,我們需要使用bdb的話,有以下問題需要解決...
Berkeleydb 學習筆記 原創
berkeleydb主要使用key value的方式.可以對實時instance進行訪問,物件級的訪問 同時也適合作為嵌入式db使用.一.建立environment 1.建立environmentconfig 2.通過environmentconfig和envdir建立environment例項 二...
Berkeley DB使用全解
在開發桌面級應用程式時,常常需要用到可持續儲存技術,做為儲存程式在退出之前所使用的資料,如變數,物件,視窗位置,大小.一般我們會使用office access這類桌面型檔案資料庫,或者是使用登錄檔.但是它們都有一些不盡人意的缺陷.比如 1.mdb檔案無法在沒有安裝office的系統上訪問,直少得需要...