学习Berkeley DB- 入门
1 導(dǎo)言
首先,我們要了解Berkeley DB的一些基本特性,在IBM的開(kāi)發(fā)網(wǎng)站上有篇文章對(duì)其有比較清晰的介紹;
這篇文章講到了BDB的設(shè)計(jì)思想和核心數(shù)據(jù)結(jié)構(gòu)、以及數(shù)據(jù)訪問(wèn)算法;并有常用函數(shù)使用范例;算是接觸BDB的一個(gè)入門好材料;
進(jìn)入以下url閱讀:
http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html
?
我現(xiàn)在的問(wèn)題是,我們需要使用BDB的話,有以下問(wèn)題需要解決:
如何使用各個(gè)常用操作?
數(shù)據(jù)訪問(wèn)算法的選擇?
性能如何?需要做一個(gè)貼近實(shí)際的性能測(cè)試;
BDB支持多索引,那么多索引是如何建立的?
針對(duì)特定環(huán)境,如何建立合適的索引?
如何封裝,以便于我們方便的使用?
如何將SQL移植為NOSQL?
在接下來(lái)的學(xué)習(xí)中,我將集中解決以上問(wèn)題;
在這篇文章中,我們學(xué)習(xí)BDB的常用操作。
??
2 下載安裝?
Berkeley DB下載
oracle Berkeley DB官網(wǎng):
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
安裝
進(jìn)入對(duì)應(yīng)環(huán)境的安裝目錄:
cd build_unix
../dist/configure --prefix=/opt/app/todeav1/soft/bdb/
環(huán)境變量部署
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 常用操作
打開(kāi)數(shù)據(jù)庫(kù)
首先調(diào)用db_create()函數(shù)來(lái)創(chuàng)建DB 結(jié)構(gòu)的一個(gè)實(shí)例,然后再調(diào)用DB->open()函數(shù)來(lái)完成真正的打開(kāi)操作。
Berkeley DB 將所有對(duì)數(shù)據(jù)庫(kù)的操作都封裝在名為DB 的結(jié)構(gòu)中。db_create()函數(shù)的作用就是創(chuàng)建一個(gè)該結(jié)構(gòu)。
將磁盤上保存的文件作為數(shù)據(jù)庫(kù)打開(kāi)是由DB->open()函數(shù)來(lái)完成的,其原型如下所示:
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); }參數(shù)“DATABASE”指明對(duì)應(yīng)的磁盤文件名為demo.db;參數(shù)“DB_BTREE”表示數(shù)據(jù)庫(kù)底層使用的數(shù)據(jù)結(jié)構(gòu)是B 樹(shù);而參數(shù)“DB_CREATE”和“0664”則表明當(dāng)數(shù)據(jù)庫(kù)文件不存在時(shí)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)文件,并且將該文件的屬性值設(shè)置為0664。
錯(cuò)誤處理是在打開(kāi)數(shù)據(jù)庫(kù)時(shí)必須的例行檢查,這可以通過(guò)調(diào)用DB->err()函數(shù)來(lái)完成。其中 參數(shù)“ret”是在調(diào)用Berkeley DB 函數(shù)后返回的錯(cuò)誤代碼,其余參數(shù)則用于顯示結(jié)構(gòu)化的錯(cuò) 誤信息。
插入
向Berkeley DB 數(shù)據(jù)庫(kù)中添加數(shù)據(jù)可以通過(guò)調(diào)用DB->put()函數(shù)來(lái)完成,其原型如下所示:
int DB->put(DB *db, DB_TXN *txnid, DBT *key, DBT *data,
??????????????????????????? u_int32_t flags);
在向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)時(shí),如果給定的關(guān)鍵字已經(jīng)存在,大多數(shù)應(yīng)用會(huì)對(duì)于已經(jīng)存在的數(shù)據(jù)。
采用覆蓋原則。也就是說(shuō),如果數(shù)據(jù)庫(kù)中已經(jīng)保存了一個(gè)“sport/basketball”對(duì),再次調(diào)用DB->put()函數(shù)添加一個(gè)“sport/football”對(duì),那么先前保存的那些數(shù)據(jù)將會(huì)被覆蓋。但Berkeley DB 允許在調(diào)用DB->put()函數(shù)時(shí)指定參數(shù)“DB_NOOVERWRITE”,聲明不對(duì)數(shù)據(jù)庫(kù)中已經(jīng)存在的數(shù)據(jù)進(jìn)行覆蓋,一旦給出“DB_NOOVERWRITE”標(biāo)記,如果DB->put()函數(shù)在執(zhí)行過(guò)程中發(fā)現(xiàn)給出的關(guān)鍵字在數(shù)據(jù)庫(kù)中已經(jīng)存在了,就無(wú)法成功地把該Key/Data 對(duì)添加到數(shù)據(jù)庫(kù)中,于是將返回錯(cuò)誤代碼 “DB_KEYEXIST”。
檢索數(shù)據(jù)
從Berkeley DB 數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)可以通過(guò)調(diào)用DB->get()函數(shù)來(lái)完成,其原型如下所示:
int DB->get(DB *db, DB_TXN *txnid, DBT *key, DBT *data,
??????????????????????????? u_int32_t flags);
在進(jìn)行數(shù)據(jù)檢索時(shí),對(duì)DB->get()函數(shù)的返回值進(jìn)行處理是必不可少的,因?yàn)樗鼣y帶著檢索操作是否成功完成等信息。下面列出的是DB->get()函數(shù)的返回值:
◆0?? 函數(shù)調(diào)用成功,指定的關(guān)鍵字被找到;
◆DB_NOTFOUND??????? 函數(shù)調(diào)用成功,但指定的關(guān)鍵字未被找到;
◆大于0???? 函數(shù)調(diào)用失敗,可能出現(xiàn)了系統(tǒng)錯(cuò)誤。
刪除
從Berkeley DB 數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)可以通過(guò)調(diào)用DB->del()函數(shù)來(lái)完成,其原型如下所示:
int DB->del(DB *db, DB_TXN *txnid, DBT *key, u_int32_t flags);
刪除數(shù)據(jù)只需給出相應(yīng)的關(guān)鍵字,不用指明與之對(duì)應(yīng)的數(shù)據(jù)。
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");關(guān)閉數(shù)據(jù)庫(kù)
對(duì)于一次完整的數(shù)據(jù)庫(kù)操作過(guò)程來(lái)說(shuō),關(guān)閉數(shù)據(jù)庫(kù)是不可或缺的一個(gè) 節(jié)。這是因?yàn)锽erkeley DB 需要依賴于系統(tǒng)底層的緩沖機(jī)制,也就是說(shuō)只有在數(shù)據(jù)庫(kù)正常關(guān)閉的時(shí)候,修改后的數(shù)據(jù)才有可能全部寫到磁盤上,同時(shí)它所占用的資源也才能真正被全部釋放。關(guān)閉數(shù)據(jù)庫(kù)的操作是通過(guò)調(diào)用DB->close()函數(shù)來(lái)完成的,其原型如下所示:
int DB->close(DB *db, u_int32_t flags);
刷新緩存到硬盤
Berkeley DB的所有操作都是在內(nèi)存中進(jìn)行,在關(guān)閉數(shù)據(jù)庫(kù)句柄時(shí),會(huì)將所有數(shù)據(jù)寫入到硬盤中;在程序運(yùn)行中,如需要同步數(shù)據(jù)到硬盤,可調(diào)用sync()函數(shù):
注:這個(gè)函數(shù)在4.3之前的版本是無(wú)參的,而在之后的版本增加參數(shù),修改之前的例子需注意兼容;
dbp->sync(dbp,0);
更多
這篇文章對(duì)插入時(shí)每個(gè)操作有個(gè)詳細(xì)的說(shuō)明,并給出了進(jìn)一步學(xué)習(xí)的文檔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 更多學(xué)習(xí)資料
Berkeley DB 官方開(kāi)發(fā)者文檔
http://docs.oracle.com/cd/E17076_03/html/index.html
官方主頁(yè):http://www.oracle.com/database/berkeley-db/db/index.html
產(chǎn)品下載:http://www.oracle.com/technology/software/products/berkeley-db/index.html
Berkeley DB中國(guó)研發(fā)團(tuán)隊(duì)博客:
http://www.bdbchina.com/
文檔中心:http://www.oracle.com/technology/documentation/berkeley-db/db/index.html
Berkeley DB官方論壇(貌似已經(jīng)無(wú)人維護(hù)):
https://forums.oracle.com/community/developer/english/berkeley_db_family
?
?
Posted by: 大CC | 17SEP,2013
博客:blog.me115.com
微博:新浪微博
?
轉(zhuǎn)載于:https://www.cnblogs.com/me115/p/3324040.html
總結(jié)
以上是生活随笔為你收集整理的学习Berkeley DB- 入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对pthread_cond_wait()
- 下一篇: SQL server触发器中 updat