• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            嵌入式數(shù)據(jù)庫(kù)系統(tǒng)Berkeley DB(+)

            http://www.360doc.com/content/06/0116/11/2459_59098.shtml

             

             

            級(jí)別: 初級(jí)

            施聰, 高級(jí)程序員、網(wǎng)絡(luò)設(shè)計(jì)師

            2005 4 01

            Berkeley DB是歷史悠久的嵌入式數(shù)據(jù)庫(kù)系統(tǒng),主要應(yīng)用在UNIX/LINUX操作系統(tǒng)上,其設(shè)計(jì)思想是簡(jiǎn)單、小巧、可靠、高性能。本文是對(duì)DB開(kāi)發(fā)的一個(gè)入門(mén)級(jí)指南,重點(diǎn)討論了DB的核心數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)訪問(wèn)算法,并通過(guò)實(shí)際的代碼演示如何使用DB。最后有一個(gè)對(duì)DB的簡(jiǎn)單總結(jié),并提出作者對(duì)工具選擇的一些感想。

            前言

            UNIX/LINUX平臺(tái)下的數(shù)據(jù)庫(kù)種類非常多,參考資料1中列舉了其中的大部分。通常,我們?cè)谠O(shè)計(jì)UNIX/LINUX平臺(tái)下的應(yīng)用軟件時(shí),如果數(shù)據(jù)種類繁多,數(shù)據(jù)與數(shù)據(jù)之間關(guān)系比較復(fù)雜,就會(huì)選用一些大型的企業(yè)級(jí)數(shù)據(jù)庫(kù)系統(tǒng),如DB2ORACLESYBASE等,如果軟件規(guī)模不大,就傾向選用如MYSQL、POSTGRESQL等中小型數(shù)據(jù)庫(kù)。例如使用PHP/PERL + MYSQL/POSTGRESQL設(shè)計(jì)網(wǎng)站基本上是一個(gè)很常規(guī)的做法。但是,當(dāng)應(yīng)用軟件管理的數(shù)據(jù)類型較少(特別注意:這并不是說(shuō)需要管理的數(shù)據(jù)量?。?,數(shù)據(jù)管理本身不復(fù)雜,且對(duì)數(shù)據(jù)操作要求高效率,則由大名鼎鼎的Berkeley(美國(guó)加州大學(xué)伯克利分校)開(kāi)發(fā)的 Berkeley DB可能是一個(gè)很明智的選擇。

            DB綜述

            DB最初開(kāi)發(fā)的目的是以新的HASH訪問(wèn)算法來(lái)代替舊的hsearch函數(shù)和大量的dbm實(shí)現(xiàn)(如AT&TdbmBerkeleyndbmGNU項(xiàng)目的gdbm,DB的第一個(gè)發(fā)行版在1991年出現(xiàn),當(dāng)時(shí)還包含了B+樹(shù)數(shù)據(jù)訪問(wèn)算法。在1992年,BSD UNIX4.4發(fā)行版中包含了DB1.85版?;旧险J(rèn)為這是DB的第一個(gè)正式版。在1996年中期,Sleepycat軟件公司成立,提供對(duì)DB的商業(yè)支持。在這以后,DB得到了廣泛的應(yīng)用,當(dāng)前最新版本是4.3.27

            DB支持幾乎所有的現(xiàn)代操作系統(tǒng),如LINUX、UNIX、WINDOWS等,也提供了豐富的應(yīng)用程序接口,支持C、C++、JAVA、PERL、TCLPYTHON、PHP等。DB的應(yīng)用十分廣泛,在很多知名的軟件中都能看到其身影。例如參考資料2中作者談到利用DBLINUX下實(shí)現(xiàn)內(nèi)核級(jí)文件系統(tǒng);參考資料3中通過(guò)實(shí)際測(cè)試數(shù)據(jù)說(shuō)明DB提高了OPENLDAP的效率。LINUX下的軟件包管理器RPM也使用DB管理軟件包相關(guān)數(shù)據(jù),可以使用命令file查看RPM數(shù)據(jù)目錄/var/lib/rpm下的文件,則有形式如下的輸出:

            Dirnames: Berkeley DB (Btree, version 9, native byte-order)
            Filemd5s: Berkeley DB (Hash, version 8, native byte-order)

            值得注意的是DB是嵌入式數(shù)據(jù)庫(kù)系統(tǒng),而不是常見(jiàn)的關(guān)系/對(duì)象型數(shù)據(jù)庫(kù),對(duì)SQL語(yǔ)言不支持,也不提供數(shù)據(jù)庫(kù)常見(jiàn)的高級(jí)功能,如存儲(chǔ)過(guò)程,觸發(fā)器等。

             

             

             

            DB的設(shè)計(jì)思想

            DB的設(shè)計(jì)思想是簡(jiǎn)單、小巧、可靠、高性能。如果說(shuō)一些主流數(shù)據(jù)庫(kù)系統(tǒng)是大而全的話,那么DB就可稱為小而精。DB提供了一系列應(yīng)用程序接口(API),調(diào)用本身很簡(jiǎn)單,應(yīng)用程序和DB所提供的庫(kù)在一起編譯成為可執(zhí)行程序。這種方式從兩方面極大提高了DB的效率。第一:DB庫(kù)和應(yīng)用程序運(yùn)行在同一個(gè)地址空間,沒(méi)有客戶端程序和數(shù)據(jù)庫(kù)服務(wù)器之間昂貴的網(wǎng)絡(luò)通訊開(kāi)銷,也沒(méi)有本地主機(jī)進(jìn)程之間的通訊;第二:不需要對(duì)SQL代碼解碼,對(duì)數(shù)據(jù)的訪問(wèn)直截了當(dāng)。

            DB對(duì)需要管理的數(shù)據(jù)看法很簡(jiǎn)單,DB數(shù)據(jù)庫(kù)包含若干條記錄,每一個(gè)記錄由關(guān)鍵字和數(shù)據(jù)(KEY/VALUE)構(gòu)成。數(shù)據(jù)可以是簡(jiǎn)單的數(shù)據(jù)類型,也可以是復(fù)雜的數(shù)據(jù)類型,例如C語(yǔ)言中結(jié)構(gòu)。DB對(duì)數(shù)據(jù)類型不做任何解釋, 完全由程序員自行處理,典型的C語(yǔ)言指針的"自由"風(fēng)格。如果把記錄看成一個(gè)有n個(gè)字段的表,那么第1個(gè)字段為表的主鍵,第2--n個(gè)字段對(duì)應(yīng)了其它數(shù)據(jù)。DB應(yīng)用程序通常使用多個(gè)DB數(shù)據(jù)庫(kù),從某種意義上看,也就是關(guān)系數(shù)據(jù)庫(kù)中的多個(gè)表。DB庫(kù)非常緊湊,不超過(guò)500K,但可以管理大至256T的數(shù)據(jù)量。

            DB的設(shè)計(jì)充分體現(xiàn)了UNIX的基于工具的哲學(xué),即若干簡(jiǎn)單工具的組合可以實(shí)現(xiàn)強(qiáng)大的功能。DB的每一個(gè)基礎(chǔ)功能模塊都被設(shè)計(jì)為獨(dú)立的,也即意味著其使用領(lǐng)域并不局限于DB本身。例如加鎖子系統(tǒng)可以用于非DB應(yīng)用程序的通用操作,內(nèi)存共享緩沖池子系統(tǒng)可以用于在內(nèi)存中基于頁(yè)面的文件緩沖。

             

             

             

            DB核心數(shù)據(jù)結(jié)構(gòu)

            數(shù)據(jù)庫(kù)句柄結(jié)構(gòu)DB:包含了若干描述數(shù)據(jù)庫(kù)屬性的參數(shù),如數(shù)據(jù)庫(kù)訪問(wèn)方法類型、邏輯頁(yè)面大小、數(shù)據(jù)庫(kù)名稱等;同時(shí),DB結(jié)構(gòu)中包含了大量的數(shù)據(jù)庫(kù)處理函數(shù)指針,大多數(shù)形式為 (*dosomething(DB *, arg1, arg2, …)。其中最重要的有open,close,put,get等函數(shù)。

            數(shù)據(jù)庫(kù)記錄結(jié)構(gòu)DBTDB中的記錄由關(guān)鍵字和數(shù)據(jù)構(gòu)成,關(guān)鍵字和數(shù)據(jù)都用結(jié)構(gòu)DBT表示。實(shí)際上完全可以把關(guān)鍵字看成特殊的數(shù)據(jù)。結(jié)構(gòu)中最重要的兩個(gè)字段是 void * datau_int32_t size,分別對(duì)應(yīng)數(shù)據(jù)本身和數(shù)據(jù)的長(zhǎng)度。

            數(shù)據(jù)庫(kù)游標(biāo)結(jié)構(gòu)DBC:游標(biāo)(cursor)是數(shù)據(jù)庫(kù)應(yīng)用中常見(jiàn)概念,其本質(zhì)上就是一個(gè)關(guān)于特定記錄的遍歷器。注意到DB支持多重記錄(duplicate records),即多條記錄有相同關(guān)鍵字,在對(duì)多重記錄的處理中,使用游標(biāo)是最容易的方式。

            數(shù)據(jù)庫(kù)環(huán)境句柄結(jié)構(gòu)DB_ENV:環(huán)境在DB中屬于高級(jí)特性,本質(zhì)上看,環(huán)境是多個(gè)數(shù)據(jù)庫(kù)的包裝器。當(dāng)一個(gè)或多個(gè)數(shù)據(jù)庫(kù)在環(huán)境中打開(kāi)后,環(huán)境可以為這些數(shù)據(jù)庫(kù)提供多種子系統(tǒng)服務(wù),例如多線/進(jìn)程處理支持、事務(wù)處理支持、高性能支持、日志恢復(fù)支持等。

            DB中核心數(shù)據(jù)結(jié)構(gòu)在使用前都要初始化,隨后可以調(diào)用結(jié)構(gòu)中的函數(shù)(指針)完成各種操作,最后必須關(guān)閉數(shù)據(jù)結(jié)構(gòu)。從設(shè)計(jì)思想的層面上看,這種設(shè)計(jì)方法是利用面向過(guò)程語(yǔ)言實(shí)現(xiàn)面對(duì)對(duì)象編程的一個(gè)典范。

             

             

             

            DB數(shù)據(jù)訪問(wèn)算法

            在數(shù)據(jù)庫(kù)領(lǐng)域中,數(shù)據(jù)訪問(wèn)算法對(duì)應(yīng)了數(shù)據(jù)在硬盤(pán)上的存儲(chǔ)格式和操作方法。在編寫(xiě)應(yīng)用程序時(shí),選擇合適的算法可能會(huì)在運(yùn)算速度上提高1個(gè)甚至多個(gè)數(shù)量級(jí)。大多數(shù)數(shù)據(jù)庫(kù)都選用B+樹(shù)算法,DB也不例外,同時(shí)還支持HASH算法、Recno算法和Queue算法。接下來(lái),我們將討論這些算法的特點(diǎn)以及如何根據(jù)需要存儲(chǔ)數(shù)據(jù)的特點(diǎn)進(jìn)行選擇。

            B+樹(shù)算法:B+樹(shù)是一個(gè)平衡樹(shù),關(guān)鍵字有序存儲(chǔ),并且其結(jié)構(gòu)能隨數(shù)據(jù)的插入和刪除進(jìn)行動(dòng)態(tài)調(diào)整。為了代碼的簡(jiǎn)單,DB沒(méi)有實(shí)現(xiàn)對(duì)關(guān)鍵字的前綴碼壓縮。B+樹(shù)支持對(duì)數(shù)據(jù)查詢、插入、刪除的常數(shù)級(jí)速度。關(guān)鍵字可以為任意的數(shù)據(jù)結(jié)構(gòu)。

            HASH算法:DB中實(shí)際使用的是擴(kuò)展線性HASH算法(extended linear hashing),可以根據(jù)HASH表的增長(zhǎng)進(jìn)行適當(dāng)?shù)恼{(diào)整。關(guān)鍵字可以為任意的數(shù)據(jù)結(jié)構(gòu)。

            Recno算法: 要求每一個(gè)記錄都有一個(gè)邏輯紀(jì)錄號(hào),邏輯紀(jì)錄號(hào)由算法本身生成。實(shí)際上,這和關(guān)系型數(shù)據(jù)庫(kù)中邏輯主鍵通常定義為int AUTO型是同一個(gè)概念。Recho建立在B+樹(shù)算法之上,提供了一個(gè)存儲(chǔ)有序數(shù)據(jù)的接口。記錄的長(zhǎng)度可以為定長(zhǎng)或不定長(zhǎng)。

            Queue算法:和Recno方式接近, 只不過(guò)記錄的長(zhǎng)度為定長(zhǎng)。數(shù)據(jù)以定長(zhǎng)記錄方式存儲(chǔ)在隊(duì)列中,插入操作把記錄插入到隊(duì)列的尾部,相比之下插入速度是最快的。

            對(duì)算法的選擇首先要看關(guān)鍵字的類型,如果為復(fù)雜類型,則只能選擇B+樹(shù)或HASH算法,如果關(guān)鍵字為邏輯記錄號(hào),則應(yīng)該選擇RecnoQueue算法。當(dāng)工作集關(guān)鍵字有序時(shí),B+樹(shù)算法比較合適;如果工作集比較大且基本上關(guān)鍵字為隨機(jī)分布時(shí),選擇HASH算法。Queue算法只能存儲(chǔ)定長(zhǎng)的記錄,在高的并發(fā)處理情況下,Queue算法效率較高;如果是其它情況,則選擇Recno算法,Recno算法把數(shù)據(jù)存儲(chǔ)為平面文件格式。

             

             

             

             

            DB常用函數(shù)使用范例

             
            #include <db.h> 
            #include <stdio.h>
            #include <stdlib.h>
            #include <pthread.h>
             
            /* DB的函數(shù)執(zhí)行完成后,返回0代表成功,否則失敗 */
            void print_error(int ret)
            {
                    if(ret != 0)
                           printf("ERROR: %s\n",db_strerror(ret));
            }
             
            /* 數(shù)據(jù)結(jié)構(gòu)DBT在使用前,應(yīng)首先初始化,否則編譯可通過(guò)但運(yùn)行時(shí)報(bào)參數(shù)錯(cuò)誤  */
            void init_DBT(DBT * key, DBT * data)
            {
                    memset(key, 0, sizeof(DBT));
                    memset(data, 0, sizeof(DBT));
            }
             
            void main(void)
            {
                    DB *dbp;           
                    DBT key, data;
                    u_int32_t flags;  
                    int ret;
             
                    char *fruit = "apple";
                    int number = 15;
                    
                    typedef struct customer
                    {
                           int  c_id;
                           char name[10];
                           char address[20];
                           int  age;
                    } CUSTOMER;
                    CUSTOMER cust; 
                    int key_cust_c_id = 1;
             
                    cust.c_id = 1;
                    strncpy(cust.name, "javer", 9);
                    strncpy(cust.address, "chengdu", 19);
                    cust.age = 32;
             
                    /* 首先創(chuàng)建數(shù)據(jù)庫(kù)句柄 */
                    ret = db_create(&dbp, NULL, 0);
                    print_error(ret);
                    
                    /* 創(chuàng)建數(shù)據(jù)庫(kù)標(biāo)志 */
                    flags = DB_CREATE;    
             
                    /* 創(chuàng)建一個(gè)名為single.db的數(shù)據(jù)庫(kù),使用B+樹(shù)訪問(wèn)算法,本段代碼演示對(duì)簡(jiǎn)單數(shù)據(jù)類型的處理 */
                    ret = dbp->open(dbp, NULL, "single.db", NULL, DB_BTREE, flags, 0); 
                    print_error(ret);
             
                    init_DBT(&key, &data);
                    
                    /* 分別對(duì)關(guān)鍵字和數(shù)據(jù)賦值和規(guī)定長(zhǎng)度 */
                    key.data = fruit;
                    key.size = strlen(fruit) + 1;
                    data.data = &number;
                    data.size = sizeof(int);
             
                    /* 把記錄寫(xiě)入數(shù)據(jù)庫(kù)中,不允許覆蓋關(guān)鍵字相同的記錄 */
                    ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE); 
                    print_error(ret);
                    
            /* 手動(dòng)把緩存中的數(shù)據(jù)刷新到硬盤(pán)文件中,實(shí)際上在關(guān)閉數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)會(huì)被自動(dòng)刷新 */
            dbp->sync()
                    
            init_DBT(&key, &data);
             
                    key.data = fruit;
                    key.size = strlen(fruit) + 1;
                    
                    /* 從數(shù)據(jù)庫(kù)中查詢關(guān)鍵字為apple的記錄 */
                    ret = dbp->get(dbp, NULL, &key, &data, 0);
                    print_error(ret);
             
                    /* 特別要注意數(shù)據(jù)結(jié)構(gòu)DBT的字段datavoid *型,所以在對(duì)data賦值和取值時(shí),要做必要的類型轉(zhuǎn)換。 */
                    printf("The number = %d\n", *(int*)(data.data));
                    
                    if(dbp != NULL)
                           dbp->close(dbp, 0); 
             
                    ret = db_create(&dbp, NULL, 0);
                    print_error(ret);
             
                    flags = DB_CREATE;    
             
                    /* 創(chuàng)建一個(gè)名為complex.db的數(shù)據(jù)庫(kù),使用HASH訪問(wèn)算法,本段代碼演示對(duì)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的處理 */
                    ret = dbp->open(dbp, NULL, "complex.db", NULL, DB_HASH, flags, 0); 
                    print_error(ret);
             
                    init_DBT(&key, &data);
             
                    key.size = sizeof(int);
                    key.data = &(cust.c_id);
             
                    data.size = sizeof(CUSTOMER);
                    data.data = &cust;
             
                    ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE);
                    print_error(ret);
                    
                    memset(&cust, 0, sizeof(CUSTOMER));
                    
                    key.size = sizeof(int);
                    key.data = &key_cust_c_id;
             
                    data.data = &cust;
                    data.ulen = sizeof(CUSTOMER); 
                    data.flags = DB_DBT_USERMEM;
             
                    dbp->get(dbp, NULL, &key, &data, 0);
                    print_error(ret);
                    
                    printf("c_id = %d name = %s address = %s age = %d\n", 
                           cust.c_id, cust.name, cust.address, cust.age);
                    
                    if(dbp != NULL)
                           dbp->close(dbp, 0); 
            }
             

             

             

             

            DB游標(biāo)使用范例

            游標(biāo)是依賴于數(shù)據(jù)庫(kù)句柄的,應(yīng)用程序代碼框架如下:

             
                    /* 定義一個(gè)游標(biāo)變量 */
                    DBC * cur;
                    /* 首先打開(kāi)數(shù)據(jù)庫(kù),再打開(kāi)游標(biāo) */
                    dbp->open(dbp, ……);
                    dbp->cursor(dbp, NULL, &cur, 0);
                    
                    /* do something with cursor */
             
                    /* 首先關(guān)閉,在關(guān)閉數(shù)據(jù)庫(kù) */
                    cur->c_close(cur);
                    dbp->close(dbp, 0);
                    

             

            在游標(biāo)打開(kāi)后,可以以多種方式遍歷特定記錄。

             
                           Memset(&key, 0, sizeof(DBT));
                    Memset(&data, 0, sizeof(DBT));
             
                    /* 因?yàn)?span lang="EN-US">KEY和DATA為空,則游標(biāo)遍歷整個(gè)數(shù)據(jù)庫(kù)記錄 */
                    While((ret = cur->c_get(cur, &key, &data, DB_NEXT)) == 0)
                    {
                           /* do something with key and data */
                    }
                    

             

            當(dāng)想查詢特定關(guān)鍵字對(duì)應(yīng)的記錄,則應(yīng)對(duì)關(guān)鍵字賦值,并把cur->c_get()函數(shù)中標(biāo)志位設(shè)置為DB_SET。例如:

             
                           key.data = "xxxxx";
                    key.size =  XXX;
                    While((ret = cur->c_get(cur, &key, &data, DB_SET)) == 0)
                    {
                           /* do something with key and data */
                    }
                    

             

            游標(biāo)的作用還有很多,如查詢多重記錄,插入/修改/刪除記錄等。

             

             

             

            DB環(huán)境使用范例

            本文前面已說(shuō)明環(huán)境是DB數(shù)據(jù)庫(kù)的包裝器,提供多種高級(jí)功能。應(yīng)用程序代碼框架如下:

             
                           /* 定義一個(gè)環(huán)境變量,并創(chuàng)建 */
                    DB_ENV *dbenv;
                    db_env_create(&dbenv, 0);
                    
            /* 在環(huán)境打開(kāi)之前,可調(diào)用形式為dbenv->set_XXX()的若干函數(shù)設(shè)置環(huán)境 */
                    /* 通知DB使用Rijndael加密算法(參考資料4)對(duì)數(shù)據(jù)進(jìn)行處理 */
            dbenv->set_encrypt(dbenv, "encrypt_string", DB_ENCRYPT_AES);
                    /* 設(shè)置DB的緩存為5M */
            dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0);
            /* 設(shè)置DB查找數(shù)據(jù)庫(kù)文件的目錄 */
                    dbenv->set_data_dir(dbenv, "/usr/javer/work_db");
             
                    /* 打開(kāi)數(shù)據(jù)庫(kù)環(huán)境,注意后四個(gè)標(biāo)志分別指示DB啟動(dòng)日志、加鎖、緩存、事務(wù)處理子系統(tǒng) */
                    dbenv->open(dbenv,home,DB_CREATE|DB_INIT_LOG|DB_INIT_LOCK| DB_INIT_MPOOL|DB_INIT_TXN, 0)
                    
                    /* 在環(huán)境打開(kāi)后,則可以打開(kāi)若干個(gè)數(shù)據(jù)庫(kù),所有數(shù)據(jù)庫(kù)的處理都在環(huán)境的控制和保護(hù)中。注意db_create函數(shù)的第二個(gè)參數(shù)是環(huán)境變量 */
             
            db_create(&dbp1, dbenv, 0)
            dbp1->open(dbp1, ……);
             
            db_create(&dbp2, dbenv, 0);
            dbp1->open(dbp2, ……);
             
                    /* do something with the database */
             
                    /* 最后首先關(guān)閉打開(kāi)的數(shù)據(jù)庫(kù),再關(guān)閉環(huán)境 */
                    dbp2->close(dbp2, 0);
                    dbp1->close(dbp1, 0);
                    dbenv->close(dbenv, 0);
                    

             

             

             

            DB軟件的安裝和編譯

            DB的官方站點(diǎn)http://www.sleepycat.com/下載最新的軟件包db-4.3.27.tar.gz,解壓到工作目錄,進(jìn)入該目錄,依次執(zhí)行下列三條命令即可。

             
            ../dist/configure
            make
            make install

             

            執(zhí)行make uninstall,則可卸載已安裝的DB軟件。

            DB缺省把庫(kù)和頭文件安裝在目錄/usr/local/BerkeleyDB.4.3/下,使用gcc test.c -ggdb -I/usr/local/BerkeleyDB.4.3/include/ -L/usr/local/BerkeleyDB.4.3/lib/ -ldb -lpthread就可正確編譯程序。如果讀者的測(cè)試主機(jī)操作系統(tǒng)為RED HAT9,則安裝的DB版本可能是4.0。特別要注意到這兩個(gè)版本的庫(kù)是不兼容的。例如打開(kāi)數(shù)據(jù)庫(kù)函數(shù)DB->open(),4.0版本中入?yún)?span lang="EN-US">6個(gè),而在4.3版中則為7個(gè)(可自行比較兩個(gè)庫(kù)的頭文件db.hDB->open函數(shù)的定義)。因?yàn)樵?span lang="EN-US">DB相關(guān)的應(yīng)用程序中,open函數(shù)基本上都是要執(zhí)行的,所以如果函數(shù)和版本不匹配,編譯肯定會(huì)出錯(cuò)。當(dāng)然,編譯完成后,可以使用命令ldd查看庫(kù)的依賴關(guān)系。

             

             

             

            總結(jié)

            DB是一個(gè)具有工業(yè)強(qiáng)度的嵌入式數(shù)據(jù)庫(kù)系統(tǒng),數(shù)據(jù)處理的效率很高。DB功能的穩(wěn)定性歷經(jīng)時(shí)間的考驗(yàn),在大量應(yīng)用程序中使用便是明證。可以想見(jiàn),在同等代碼質(zhì)量的條件下,軟件的BUG數(shù)和代碼的長(zhǎng)度是成正比的,相對(duì)幾十兆、幾百兆大型數(shù)據(jù)庫(kù)軟件,DB的只有不到500K的大??!

            從實(shí)現(xiàn)功能上看,DB是輕量級(jí)數(shù)據(jù)庫(kù)系統(tǒng),或可稱為"" 輕量級(jí)數(shù)據(jù)庫(kù)系統(tǒng)。但是,我認(rèn)為不能因此而心存輕視之意,所謂"尺有所短,寸有所長(zhǎng)",以絕對(duì)角度比較工具之間的好壞是沒(méi)有什么意義的,關(guān)鍵在于對(duì)工具的選擇和運(yùn)用(似乎可以參考一下極限編程的思想)。也許,正確的"表達(dá)范式"應(yīng)該是:在當(dāng)前應(yīng)用背景下,選擇這種工具是最合適的。

             

             

             

            參考資料

            ·                                 Linux SQL Databases and Tools

            ·                                 Implementing a File System with the Berkeley DB

            ·                                 Performance Improvement of OpenLDAP Transactional Backend

            ·                                 Rijndael加密算法官方站點(diǎn)

             

             

             

            關(guān)于作者

            clip_image002

             

            施聰,成都人,高級(jí)程序員、網(wǎng)絡(luò)設(shè)計(jì)師。從事基于UNIX/LINUX下的c/c++程序設(shè)計(jì)和數(shù)據(jù)庫(kù)建模工作已10年。可通過(guò)javer@163.commemncmp@yahoo.com.cn和他聯(lián)系。

             

            posted on 2011-08-28 20:27 肥仔 閱讀(484) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫(kù)

            久久精品国产第一区二区| 久久男人Av资源网站无码软件| AV狠狠色丁香婷婷综合久久| 中文无码久久精品| 国产午夜久久影院| 久久国产成人午夜aⅴ影院 | 青青草国产97免久久费观看| 欧美精品一区二区久久| 色婷婷综合久久久久中文| 97久久天天综合色天天综合色hd | 久久久久久久波多野结衣高潮| 中文精品久久久久人妻不卡| 精品久久久久久国产免费了| 无码人妻精品一区二区三区久久久 | 久久国产精品久久| 久久精品久久久久观看99水蜜桃| 免费国产99久久久香蕉| 亚洲国产精品嫩草影院久久| 国产欧美久久一区二区| 日本欧美久久久久免费播放网| 久久国产三级无码一区二区| 99久久精品国产高清一区二区| 亚洲国产婷婷香蕉久久久久久| 伊人久久大香线蕉精品| 国产人久久人人人人爽| 99精品国产99久久久久久97| 久久精品中文字幕一区| 91久久精品国产91性色也| 国产三级久久久精品麻豆三级 | 国产精品午夜久久| 99久久99这里只有免费费精品| 久久亚洲熟女cc98cm| 亚洲精品乱码久久久久久蜜桃| 国产精品久久久久乳精品爆 | 99热精品久久只有精品| 久久精品亚洲精品国产色婷| 久久www免费人成精品香蕉| 五月丁香综合激情六月久久| 久久精品国产亚洲Aⅴ香蕉| 国产成人久久精品一区二区三区| 国产精品免费看久久久香蕉|