• <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)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            Berkeley DB 簡(jiǎn)單入門

            Development Environment

            Windows XP ProfessionVisual Studio C++ 2005

            Concept

            1  Berkeley DB是嵌入式數(shù)據(jù)庫系統(tǒng),支持幾乎所有的現(xiàn)代操作系統(tǒng)。

            2  由一個(gè)個(gè)文件組成,文件名為XXX.DB,一個(gè)文件中可以含有一個(gè)到多個(gè)DB

            3  Berkeley DB不支持SQL、存儲(chǔ)過程和觸發(fā)器等關(guān)系數(shù)據(jù)庫的高級(jí)特性。

            4  DatabaseDBT)就相同于關(guān)系數(shù)據(jù)庫中的Table,它的key/data 對(duì)就相當(dāng)于關(guān)系數(shù)據(jù)表的主鍵和其它n-1列,因?yàn)槟憧梢栽?span lang="EN-US">data中存入任意類型的數(shù)據(jù),比如一個(gè)結(jié)構(gòu)體。

            5  游標(biāo)(CursorDBC),就是一個(gè)關(guān)于特定記錄的遍歷器,在處理多重記錄(duplicate record,多條記錄key相同,而data不同)時(shí)使用它尤為方便,且效率高(稱為bulk get,一次獲取一批記錄)。

            6  數(shù)據(jù)庫環(huán)境(DB_ENV),為Berkeley DB的高級(jí)特性,就是多個(gè)Database的包裝器,它提供諸如日志恢復(fù)、多線程、事務(wù)處理和高性能支持等服務(wù)。

            7  數(shù)據(jù)訪問算法(Database Access Method)——數(shù)據(jù)在硬盤上存儲(chǔ)和操作的方法。Berkeley DB支持B+樹、HashRecnoQueue算法。

            Begin to Use Berkeley DB

            添加Berkeley dbinclude目錄為Applicationinclude路徑,添加其lib目錄為Applicationlib引用路徑,這樣將Berkeley DBlib和我們的Application編譯為一個(gè)程序,令其“嵌入”我們的程序中。

            Choose Database Access Method

            Access Method

            Description

            Choosing Occasion

            B+

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

            1  當(dāng)Key為復(fù)雜類型時(shí)。

            2  當(dāng)Key有序時(shí)。

            Hash

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

            1  當(dāng)Key為復(fù)雜類型。

            2  當(dāng)數(shù)據(jù)較大且key隨機(jī)分布時(shí)。

             

            Recno

            要求每一個(gè)記錄都有一個(gè)邏輯紀(jì)錄號(hào),邏輯紀(jì)錄號(hào)由算法本身生成。相當(dāng)于關(guān)系數(shù)據(jù)庫中的自動(dòng)增長字段。Recho建立在B+樹算法之上,提供了一個(gè)存儲(chǔ)有序數(shù)據(jù)的接口。記錄的長度可以為定長或不定長。

            1  當(dāng)key為邏輯記錄號(hào)時(shí)。

            2  當(dāng)非高并發(fā)的情況下。

            Queue

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

            1  1、當(dāng)key為邏輯記錄號(hào)時(shí)。

            2  定長記錄。

            3  高并發(fā)的情況下。

             

             

            Open Database

            使用Db.open來打開一個(gè)數(shù)據(jù)庫。打開數(shù)據(jù)庫有多種方式,常用的有:

            Open Flag

            Description

            DB_CREATE

            如果數(shù)據(jù)庫不存在,則創(chuàng)建之。

            DB_EXCL

            如果數(shù)據(jù)庫存在,則返回失敗。只和DB_CREATE一起使用才有意義。

            DB_RDONLY

            以只讀的方式打開數(shù)據(jù)庫。

             

            代碼示例:

            #include <db_cxx.h>

             

            ...

             

            Db db(NULL, 0);               // Instantiate the Db object

             

            u_int32_t oFlags = DB_CREATE; // Open flags;

             

            try {

                // Open the database

                db.open(NULL,                // Transaction pointer

                        "my_db.db",          // Database file name

                        NULL,                // Optional logical database name

                        DB_BTREE,            // Database access method

                        oFlags,              // Open flags

                        0);                  // File mode (using defaults)

            // DbException is not subclassed from std::exception, so

            // need to catch both of these.

            } catch(DbException &e) {

                // Error handling code goes here    

            } catch(std::exception &e) {

                // Error handling code goes here

            }

             

            如果需要使用Berkeley DB的高級(jí)功能,可以在DbEnv(環(huán)境)中打開Database

            #include <db_cxx.h>

            ...

            u_int32_t env_flags = DB_CREATE;  // If the environment does not

                                              // exist, create it.

            u_int32_t db_flags = DB_CREATE;   // If the database does not

                                              // exist, create it.

            std::string envHome("/export1/testEnv");

            std::string dbName("mydb.db");

            DbEnv myEnv(0);

            Db *myDb;

             

            try {

                myEnv.open(envHome.c_str(), env_flags, 0);

                myDb = new Db(&myEnv, 0);

                myDb->open(NULL,

                           dbName.c_str(),

                           NULL,

                           DB_BTREE,

                           db_flags,

                           0);

            } catch(DbException &e) {

                std::cerr << "Error opening database environment: "

                          << envHome

                          << " and database "

                          << dbName << std::endl;

                std::cerr << e.what() << std::endl;

                exit( -1 );

            } catch(std::exception &e) {

                std::cerr << "Error opening database environment: "

                          << envHome

                          << " and database "

                          << dbName << std::endl;

                std::cerr << e.what() << std::endl;

                exit( -1 );

            }

             

            Close Database

            關(guān)閉數(shù)據(jù)庫很簡(jiǎn)單,只需要使用Db.close(0)來關(guān)閉db

            #include <db_cxx.h>

             

            ...

             

            Db db(NULL, 0);

             

             // Database open and access operations happen here.

             

            try {

                // Close the database

                db.close(0);

            // DbException is not subclassed from std::exception, so

            // need to catch both of these.

            } catch(DbException &e) {

                // Error handling code goes here    

            } catch(std::exception &e) {

                // Error handling code goes here

            }

             

            當(dāng)在DbEnv中打開數(shù)據(jù)庫時(shí),關(guān)閉此DbEnv中的所有的Db后,必須關(guān)閉此DbEnv

            try {

                if (myDb != NULL) {

                    myDb->close(0);

                }

                myEnv.close(0);

                

            } catch(DbException &e) {

                std::cerr << "Error closing database environment: "

                          << envHome

                          << " or database "

                          << dbName << std::endl;

                std::cerr << e.what() << std::endl;

                exit( -1 );

            } catch(std::exception &e) {

                std::cerr << "Error closing database environment: "

                          << envHome

                          << " or database "

                          << dbName << std::endl;

                std::cerr << e.what() << std::endl;

                exit( -1 );

            }

             

            在操作數(shù)據(jù)(添加、修改和刪除數(shù)據(jù))時(shí),都是在內(nèi)存中進(jìn)行的,并沒有寫到磁盤中,而只有當(dāng)我們調(diào)用Db.close(0)方法后,才將內(nèi)存中的數(shù)據(jù)寫入磁盤中。如果不想關(guān)閉數(shù)據(jù)庫而又想把數(shù)據(jù)寫入磁盤的話,可以調(diào)用Db.sync(0)方法,及時(shí)將數(shù)據(jù)寫入磁盤可以降低發(fā)生DB crash而導(dǎo)致數(shù)據(jù)丟失的危險(xiǎn)的幾率。

             

            posted on 2012-06-01 16:20 肥仔 閱讀(3545) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫

            久久久久国产成人精品亚洲午夜| 久久午夜羞羞影院免费观看| 久久国产劲爆AV内射—百度| 久久精品国产亚洲AV麻豆网站| 欧美成a人片免费看久久| 久久婷婷五月综合97色一本一本 | 久久er热视频在这里精品| 内射无码专区久久亚洲| 日韩亚洲欧美久久久www综合网| 久久国产亚洲精品| 93精91精品国产综合久久香蕉| 久久精品国产久精国产果冻传媒 | 国产精品热久久无码av| 亚洲成色WWW久久网站| 久久青青草原精品国产不卡| 国产精品一久久香蕉国产线看 | 亚洲第一永久AV网站久久精品男人的天堂AV| 久久精品国产亚洲av麻豆小说| 成人久久免费网站| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久综合狠狠综合久久综合88| 久久久无码精品亚洲日韩蜜臀浪潮 | 无码精品久久一区二区三区 | 色99久久久久高潮综合影院| 国产L精品国产亚洲区久久| 国产精品女同久久久久电影院| 亚洲中文字幕无码久久精品1| 亚洲国产综合久久天堂 | 国产午夜精品理论片久久| 久久香综合精品久久伊人| 亚洲精品乱码久久久久久中文字幕 | 欧美丰满熟妇BBB久久久| 久久久久久伊人高潮影院| 一本久道久久综合狠狠躁AV| 亚洲国产精品无码久久九九 | 国产91久久综合| 久久无码国产| 一本一道久久a久久精品综合| 伊人伊成久久人综合网777| 亚洲国产日韩欧美综合久久| 国产精品久久久久久久久久影院|