Berkeley DB是一個開放源代碼的內(nèi)嵌式�(shù)�(jù)庫管理系�(tǒng),能夠為�(yīng)用程序提供高性能的數(shù)�(jù)管理服務(wù)。應(yīng)用它程序員只需要調(diào)用一些簡單的API就可以完成對�(shù)�(jù)的訪問和管理�
Berkeley DB是由美國Sleepycat Software公司開發(fā)的一套開放源碼的嵌入式數(shù)�(jù)庫的程序庫(database library�,它為應(yīng)用程序提供可伸縮的、高性能�、有事務(wù)保護功能的數(shù)�(jù)管理服務(wù)。Berkeley DB為數(shù)�(jù)的存取和管理提供了一組簡潔的函數(shù)�(diào)用API接口�
它是一個經(jīng)典的C-library模式的toolkit,為程序員提供廣泛豐富的函數(shù)�,是為應(yīng)用程序開�(fā)者提供工�(yè)級強度的�(shù)�(jù)庫服�(wù)而設(shè)計的�
其主要特點如下:
嵌入式(Embedded):它直接鏈接到�(yīng)用程序中,與�(yīng)用程序運行于同樣的地址空間�,因�,無論是在網(wǎng)�(luò)上不同計算機之間還是在同一臺計算機的不同進程之間,數(shù)�(jù)庫操作并不要求進程間通訊�
Berkeley DB為多種編程語言提供了API接口,其中包括C、C++、Java、Perl、Tcl、Python和PHP,所有的�(shù)�(jù)庫操作都在程序庫�(nèi)部發(fā)生。多個進程,或者同一進程的多個線程可同時使用�(shù)�(jù)�,有如各自單獨使�,底層的服務(wù)如加鎖、事�(wù)日志、共享緩沖區(qū)管理、內(nèi)存管理等等都由程序庫透明地執(zhí)��
輕便靈活(Portable):它可以運行于幾乎所有的UNIX和Linux系統(tǒng)及其變種系統(tǒng)、Windows操作系統(tǒng)以及多種嵌入式實時操作系�(tǒng)之下。它�32位和64位系�(tǒng)上均可運行,已經(jīng)被好多高端的因特�(wǎng)服務(wù)�、臺式機、掌上電�、機頂盒、網(wǎng)�(luò)交換機以及其他一些應(yīng)用領(lǐng)域所采用。一旦Berkeley DB被鏈接到�(yīng)用程序中,終端用戶一般根本感覺不到有一個數(shù)�(jù)庫系�(tǒng)存在�
可伸縮(Scalable):這一點表�(xiàn)在很多方�。Database library本身是很精簡的(少于300KB的文本空間),但它能夠管理規(guī)模高�(dá)256TB的數(shù)�(jù)�。它支持高并�(fā)度,成千上萬個用戶可同時操縱同一個數(shù)�(jù)�。Berkeley DB能以足夠小的空間占用量運行于有嚴(yán)格約束的嵌入式系�(tǒng),也可以在高端服�(wù)器上耗用若干GB的內(nèi)存和若干TB的磁盤空��
Berkeley DB由五個主要的子系�(tǒng)�(gòu)�.包括: 存取管理子系�(tǒng)、內(nèi)存池管理子系�(tǒng)、事�(wù)子系�(tǒng)、鎖子系�(tǒng)以及日志子系�(tǒng)�
其中存取管理子系�(tǒng)作為Berkeley DB�(shù)�(jù)庫進程包內(nèi)部核心組�,而其他子系統(tǒng)都存在于Berkeley DB�(shù)�(jù)庫進程包的外部�
每個子系統(tǒng)支持不同的應(yīng)用級��
1.�(shù)�(jù)存取子系�(tǒng)
�(shù)�(jù)�?。ˋccess Methods)子系統(tǒng)為創(chuàng)建和訪問�(shù)�(jù)庫文件提供了多種支持。Berkeley DB提供了以下四種文件存儲方法:哈希文件、B�、定長記錄(隊列)和變長記錄(基于記錄號的簡單存儲方式),應(yīng)用程序可以從中選擇最適合的文件組織結(jié)�(gòu)。程序員�(chuàng)建表時可以使用任意一種結(jié)�(gòu),并且可以在同一個應(yīng)用程序中對不同存儲類型的文件進行混合操作。在沒有事務(wù)管理的情況下,該子系�(tǒng)中的模塊可單獨使用,為應(yīng)用程序提供快速高效的�(shù)�(jù)存取服務(wù)。數(shù)�(jù)存取子系�(tǒng)適用于不需事務(wù)只需快速格式文件訪問的�(yīng)��
2.�(nèi)存池管理子系�(tǒng)
�(nèi)存池(Memory pool)子系統(tǒng)對Berkeley DB所使用的共享緩沖區(qū)進行有效的管�。它允許同時訪問�(shù)�(jù)庫的多個進程或者進程的多個線程共享一個高速緩存,�(fù)�(zé)將修改后的頁寫回文件和為新調(diào)入的頁分配內(nèi)存空�。它也可以獨立于Berkeley DB系統(tǒng)之外,單獨被�(yīng)用程序使用,為其自己的文件和頁分配內(nèi)存空�。內(nèi)存池管理子系�(tǒng)適用于需要靈活的、面向頁�、緩沖的共享文件訪問的應(yīng)用�
3.事務(wù)子系�(tǒng)
事務(wù)(Transaction)子系統(tǒng)為Berkeley DB提供事務(wù)管理功能。它允許把一組對�(shù)�(jù)庫的修改看作一個原子單位,這組操作要么全做,要么全不做。在默認(rèn)的情況下,系�(tǒng)將提供嚴(yán)格的ACID事務(wù)屬�,但是應(yīng)用程序可以選擇不使用系統(tǒng)所作的隔離保證。該子系�(tǒng)使用兩段鎖技�(shù)和先寫日志策略來保證�(shù)�(jù)庫數(shù)�(jù)的正確性和一致性。它也可以被�(yīng)用程序單獨使用來對其自身的數(shù)�(jù)更新進行事務(wù)保護。事�(wù)子系�(tǒng)適用于需要事�(wù)保證�(shù)�(jù)的修改的�(yīng)��
4.鎖子系統(tǒng)
鎖(Locking)子系統(tǒng)為Berkeley DB提供鎖機制,為系�(tǒng)提供多用戶讀取和單用戶修改同一對象的共享控�。數(shù)�(jù)存取子系�(tǒng)可利用該子系�(tǒng)獲得對頁或記錄的讀寫權(quán)�;事�(wù)子系�(tǒng)利用鎖機制來實現(xiàn)多個事�(wù)的并�(fā)控制。該子系�(tǒng)也可被應(yīng)用程序單獨采�。鎖子系�(tǒng)適用于一個靈活的、快速的、可�(shè)置的鎖管理器�
5.日志子系�(tǒng)
日志(Logging)子系統(tǒng)采用的是先寫日志的策�,用于支持事�(wù)子系�(tǒng)進行�(shù)�(jù)恢復(fù),保證數(shù)�(jù)一致性。它不大可能被應(yīng)用程序單獨使�,只能作為事�(wù)子系�(tǒng)的調(diào)用模��
以上幾部分構(gòu)成了整個Berkeley DB�(shù)�(jù)庫系�(tǒng)。各部分的關(guān)系如下圖所示:
在這個模型中,應(yīng)用程序直接調(diào)用的是數(shù)�(jù)存取子系�(tǒng)和事�(wù)管理子系�(tǒng),這兩個系�(tǒng)進而調(diào)用更下層的內(nèi)存管理子系統(tǒng)、鎖子系�(tǒng)和日志子系統(tǒng)�
由于幾個子系統(tǒng)相對比較獨立,所以應(yīng)用程序在開始的時候可以指定哪些數(shù)�(jù)管理服務(wù)將被使用??梢匀渴�?,也可以只用其中的一部分。例�,如果一個應(yīng)用程序需要支持多用戶并發(fā)操作,但不需要進行事務(wù)管理,那它就可以只用鎖子系統(tǒng)而不用事�(wù)。有些應(yīng)用程序可能需要快速的、單用戶、沒有事�(wù)管理功能的B樹存儲結(jié)�(gòu),那么應(yīng)用程序可以使鎖子系統(tǒng)和事�(wù)子系�(tǒng)失效,這樣就會減少開銷�
Berkeley DB所管理�(shù)�(jù)的邏輯組織單位是若干個獨立或有一定關(guān)系的�(shù)�(jù)�(database)�
每個數(shù)�(jù)庫由若干記錄組成,這些記錄全都被表示成(key,value)的形�。如果把一組相�(guān)�(key,value)對也看作一個表的話,那么每一個數(shù)�(jù)庫只允許存放一個table,這一點不同于一般的�(guān)系數(shù)�(jù)�。實際上,在Berkeley DB中所提到的“數(shù)�(jù)庫”,相當(dāng)于一般關(guān)系數(shù)�(jù)庫系�(tǒng)中的�;而“key/data”對相當(dāng)于關(guān)系數(shù)�(jù)庫系�(tǒng)中的�(rows);Berkeley DB不提供關(guān)系數(shù)�(jù)庫中列直接訪問的功能,而是在“key/data”對中的data項中通過實際�(yīng)用來封裝字段(�)�
在物理組織上,每一個數(shù)�(jù)庫在�(chuàng)建的時候可以由�(yīng)用程序根�(jù)其數(shù)�(jù)特點來選擇一種合適的存儲�(jié)�(gòu)。可供選擇的四種文件存儲�(jié)�(gòu)分別是:哈希文件、B樹、定長記�(隊列)和變長記�(基于記錄號的簡單存儲方式)�
一個物理的文件中可以只存放一個單獨的�(shù)�(jù)�,也可以存放若干相關(guān)或不相關(guān)的數(shù)�(jù)庫,而且這些�(shù)�(jù)庫可以分別采用除隊列之外任意不同的組織方�,以隊列組織的數(shù)�(jù)庫只能單獨存放于一個文件,不能同其他存儲類型混合存��
一個文件除了受文件長度和存儲空間的約束之外,理論上可以存儲任意多個數(shù)�(jù)�。因此系�(tǒng)定位一個數(shù)�(jù)庫通常需要兩個參�(shù)--“文件名”和“數(shù)�(jù)庫名”,這也是Berkeley DB不同于一般關(guān)系數(shù)�(jù)庫的地方�
Berkeley DB存儲系統(tǒng)為應(yīng)用程序提供了一系列的接口函�(shù),用于對�(shù)�(jù)庫的管理和操�。其中包括:
(1)�(shù)�(jù)庫的�(chuàng)�、打�、關(guān)�、刪除、重命名�,以及對�(shù)�(jù)的檢索和增刪改操��
(2)提供一些附加的功能,例如讀取數(shù)�(jù)庫狀�(tài)信息、讀取所在文件的信息、讀取所在數(shù)�(jù)庫環(huán)境的信息、清空數(shù)�(jù)庫的�(nèi)�、數(shù)�(jù)庫的同步備份、版本升�、提示出錯信息等��
(3)系統(tǒng)還提供了游標(biāo)機制,用于存取和訪問成組的數(shù)�(jù),以及對兩個或多個相�(guān)�(shù)�(jù)庫進行�(guān)�(lián)和等值連接操作�
(4)系統(tǒng)還給出了一些接口函�(shù)用于對存取策略進行�(yōu)化配�,比如應(yīng)用程序可以自己設(shè)置B樹的排序比較函數(shù)、每頁中存放key的最少數(shù)�,哈希桶的填充因�、哈希函�(shù)、哈希表長度,隊列的長度,數(shù)�(jù)庫存放的字節(jié)順序,底層存儲頁的大小,�(nèi)存分配函�(shù),高速緩存的大小,定長記錄的大小和填充位,變長記錄所用的分隔符等��