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