學習Berkeley DB 入門

2021-06-18 09:54:18 字數 3269 閱讀 5044

首先,我們要了解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官方論壇(貌似已經無人維護):

學習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的系統上訪問,直少得需要...