dbstl 是 Berkeley DB資料庫的一種新的 API,自Berkeley DB 4.8.24 發布版本開始,出現在Berkeley DB的發布版本當中。它在各個方面都非常類似 C++ STL 類庫,這樣,用戶使用 Berkeley DB就可以像使用 STL類庫的容器一樣,大大降低了Berkeley DB的使用難度。
背景,用例,stl與dbstl的用法的區別,
背景
Berkeley DB是一個業界文明的嵌入式資料庫,在非常多的開源和商業軟體當中廣泛套用。要想使用Berkeley DB,必須用編程的方式調用它的API來控制資料庫的行為,來插入/刪除/更新/查找。在dbstl出現之前已有的API包括 C/C++/Java以及各類腳本語言如perl/python/php 的API。其中C++ API 是對C API 的簡單封裝,並沒有有效利用C++語言的強大功能降低API的編程複雜性。而dbstl正是為了使得用戶更加容易的用C++語言對Berkeley DB編程而設計的,可以把它看作是對Berkeley DB C++ API的有力補充。由於STL類庫是C++語言的標準庫, C++程式設計師都對它非常熟悉。有了dbstl後,C++程式設計師的stl編程知識可以直接拿來使用dbstl對Berkeley DB編程,降低了Berkeley DB的學習曲線。
用例
1. 需要存儲的數據量太大,直接存入記憶體數據結構,比如stl當中的話,機器性能大幅下降,甚至遇到分配記憶體失敗而無法繼續運行等問題;
2. 需要事務語義(ACID). C++ STL 無法提供這樣的功能;
4. 需要持久化對象。將對象通過dbstl存儲到Berkeley DB資料庫當中,就可以很好地實現對象持久化和激活。
結構與兼容性
dbstl包括幾乎所有的stl容器類,在stl當中的 std名字空間下面的 vector, map, multimap, set, multiset以及它們的iterator類模板在dbstl當中都有它們對應的容器類,分別是 db_vector, db_map, db_multimap, db_set, db_multiset,以及它們的iterator類模板,這些類模板都在 dbstl名字空間下。與stl中的對應的類模板相比,dbstl當中這些類模板包含了完全相同的公有函式成員集合和語義/行為/用法,因而,一個原本使用stl的c++程式,只要在容器類模板名稱前綴 ‘db_’,即可使用dbstl來操控 Berkeley DB資料庫,把數據存儲在資料庫當中而不是記憶體數據結構當中, 這樣的改動幾乎就是移植到dbstl的全部所需的改動。 所以本文不再贅述dbstl的用法,除了stl與dbstl的不同之處以外。
用戶可以使用C++ STL 類庫當中的算法來通過dbstl中的標準的iterator概念實現來操縱dbstl當中的容器類,因而dbstl沒有算法集合,只有容器類模板以及它們的iterator類模板。 dbstl類庫完全通過了兩個廣泛使用的 C++ STL 實現的測試集當中的所有測試(微軟的測試集和stlport的測試集),由此可見dbstl與c++ stl類庫有高度的兼容性。
stl與dbstl的用法的區別
這樣的區別主要體現在如下幾個方面。
首先,dbstl的類模板的模板參數列表與stl的有一些不同。比如stl的容器類都有一個Allocator參數,使得用戶配置一個分配器類型,而dbstl不需要自己處理存儲細節,它把數據存入了Berkeley DB資料庫,所以它沒有Allocator類型參數。還有就是在很多stl類模板當中,需要配置比較類型,也就是定製比較的方法,在dbstl當中,這種定製是通過配置比較函式給Berkeley DB來完成的。使用dbstl的時候,通常還會用到 Berkeley DB的 C++ API,來完成資料庫配置等數據存儲/檢索之外的任務。dbstl與原來的C++ API一起組成了一個功能更加強大的,更容易使用的新的 C++ API for Berkeley DB.
其次,dbstl是讓用戶持久化數據的,因而通常沒有意義存儲記憶體指針值,用戶需要寫一些額外的代碼來保證存儲的數據在下次載入後是有效的。dbstl提供了一些輔助手段幫助用戶非常輕鬆地完成這個任務。
最後,dbstl的容器類有一些方法是特定的針對Berkeley DB的,在C++ STL類庫當中沒有對應的方法。