內存數據庫機制的使用研究報告
相對于傳統磁盤數據庫,內存數據庫通過將數據完全加載到內存,在內存中實現對數據的管理,在數據同步、數據傳送、事務處理、并行操作等方面進行了相應的改進設計,使得內存數據庫在處理數據上能夠比磁盤數據庫快得多,可以有效地解決計費系統中信控、實時累賬等部分對系統響應要求高的問題。
項目決定在信控模塊使用內存數據庫機制取代賬單中心模式進行實時累賬優惠觸發信控。
以下是對FastDB進行的幾點說明:
【開源代碼鏈接:http://sourceforge.net/projects/fastdb】
1、
功能歸納
1
)
內存數據庫具備傳統數據庫的一些基本功能:
A
:
數據的管理,內存數據庫機制是支持永久數據的管理的,包括數據庫的的定義、存儲、維護等功能。
B
:
數據的操作,內存數據庫支持對數據進行增,刪,改,查,數據完整性校驗等一些基本功能。
C
:
事務管理,內存數據庫支持調度,進程間、線程間的一些并發等操作。
d.
數據恢復備份機制,內存數據庫支持在線備份和系統崩潰后的自動恢復。
2
)
FastDB
在功能上特有的一些特點
A
:
查詢優化,與傳統數據庫管理系統咋紅執行查詢相比,當所有的數據存在于內存當中時,查詢的數度是非常快的,但是
FastDB
還是進一步使用了索引
(hash,T-tree)
、反向指針和查詢并行化進行了查詢優化。
B
:
提供了一個靈活方便的應用程序語言接口,能夠方便寫出查詢等語句。
2
、
工作原理
FastDB
是一個高效率的內存數據庫系統,在磁盤上的數據庫文件和使用該數據庫的每一個應用程序占用的虛擬內存空間相映射,這樣取消了數據文件和緩沖池中的數據傳輸。再將整個文件數據讀入內存,并且使用了高性能的鎖工具實現了只讀模式線程間、單個更改模式線程和多個只讀模式線程間的并發執行。
FastDB
通過位圖實現對內存進行分配,最小單位塊是分配量子(
16
字節)。如此大大提高了數據引用的局部性(對象數據盡可能分配在連續的內存區域),最小化了修改頁的數目和減少了事務提交時間。事務提交協議基于一個影子根頁算法,對數據庫執行原子更新操作,恢復效率很高,在存儲數據結構上可以采用
T-tree
結構(
T-tree
和
AVL-tree
相似,只是
T-tree
中每個節點中順序存儲了多個值),對于大量相似重復性數據的查詢性能相當高;也可以采用
Hash
存儲,這是用關鍵字段定位表中記錄的最好辦法(采用等號進行查詢)。
影子根頁算法概述:
FastDB
數據庫中每條對象都具有唯一的標識符(
OID
),用作一個數組(對象索引)的下標,元素值表示對象的一個句柄,在
FastDB
數據庫中存在兩個索引(當前索引和影子索引),當某個對象第一次被修改時,它會創建一個副本,當前索引中的對象句柄被修改指向副本,影子索引仍然包含一個指向該對象原始版本的句柄。所有更改發生在副本上,
FastDB
在對象索引的一個特殊位圖頁上標記出哪個索引包含修改過的對象句柄。
當一個事務被提交時,
FastDB
首先檢查對象索引的尺寸的大小,若增長了,還會重新為對象索引的影子副本重新分配內存,然后釋放“舊對象”占用的內存,釋放后,將修改過的所有位圖頁
flush
到磁盤上,然后
FastDB
將改變數據庫頭部中的當前對象索引指示符,以切換對象索引的角色。當前對象索引將變成影子索引之后,
FastDB
把修改過的所有句柄從新的對象索引中復制到先前是影子的、現在已成為當前的對象索引中。此時,兩個索引都得到了同步。(具體內存塊的移動索引管理細節需要進一步琢磨)
3、
部署方法
1
)
應用程序編譯環境需求,首先是任何一個
FastDB
應用程序必須包含頭文件:
fastdb.h
;
然后是可以選擇調用庫文件(
FastDB
編譯后提供靜態庫
(libfastdb_r.a)
和共享庫兩種庫
(libfastdb_r.so/ libfastdb_r.so.2)
給調用);
最后是
FastDB
提供很多編譯選項接口,用戶可以根據需要進行設置,比如:容錯支持,無盤模式,鎖檢測清理機制等等功能。
2
)
運行系統環境需求,理論上說,內存加載的數據庫文件規模最小是
1MB
,上限就是內存和磁盤的容量了(
FastDB
的整個優化設計是基于真個數據庫系統存放在機器物理內存中,但是它依然支持將應用在規模超過物理內存的數據庫上,只是效率不會很高)
4
、
接口調用方法
1
)
FastDB
提供了
subsql
交互式工具供用戶進行備份,查詢,監控等。(按著提示走即可)
2
)
C++
接口
A
:
打開或創建數據庫:
dbDatabase db(parameter);
db.open(parameter);
mode
的有:
dbReadOnly
,
dbAllAccess
,
dbConcurrentRead
,
dbConcurrentUpdate
四模式
B
:
FastDB
支持的數據類型:
類型
????????????????????
描述
bool ???????????????????
布爾類型
(true,false)
int1 ????????????????????
一個字節的帶符號整型
(-128..127)
int2 ????????????????????
兩個字節的帶符號整型
(-32768..32767)
int4 ????????????????????
四個字節的帶符號整型
(-2147483648..2147483647)
int8 ????????????????????
八個字節的帶符號整型
(-2**63..2**63-1)
real4 ??????????????????
四個字節的
ANSI
浮點型
real8 ??????????????????
八個字節的雙精度浮點型
char const* ?????????
非中斷整型
dbReference<T> ??
到類
T
的指針。
dbArray<T> ????????
元素類型是
T
的動態數組。
C
:
FastDB
對表的接口描述
C++
需要用類的形式來定義表結構,然后一一映射到表的
fields
,如果類有方法就得用宏:
?? CLASS_DESCRIPTOR(name,field_list)
,進行描述,還有方法宏
TYPE_DESCRIPTOR(field_list)
(具體的查看的幫助文檔)
最后只需要將類進行注冊:
REGISTER(Class Name);
D
:
游標
游標有兩種模式:
??? dbCursorViewOnly
,
dbCursorForUpdate
定義舉例
dbCursor<Class Name> instance (dbCursorForUpdate);
提供了數據庫的改、刪、查方法接口
Instance.udate()
Instance.remove()/
removeAllSelected
() /
removeAll
()
Instance.select()/select(dbquery &q);
E
:
dbquery
Q;
Q = “id = ” idvalue,”and datetime = ”,currtime;
F
:
插
數據的
insert
方法
FastDB
提供了重載
dbReference<T> insert(T const& record);
所以使用起來是很簡單的。
具體細節用法查閱手冊。
Hoho
。。。
5
、
改造計劃
暫時不用改造現有機制,如果不想在內存數據庫當中形成綜合賬單表(從原來的賬單中心的四張內存表(累賬賬單表,周期性費用表,優惠結果表,調賬結果表)中提取),減少冗余,就需要改造其現有的事務提交機制。使得事務提交后,程序能夠控制數據改變對其他進程的可見性。
6
、本人的兩點擔心
1
)
FastDB
適合主導讀取模式的應用程序,在大規模數據群處理上,進行更改事務處理的效率和準確性能上有待后查。
2
)
FastDB
雖然是一個極其優秀的開源內存數據庫,但畢竟沒有或者很少經過商用的專業的測試。系統中復雜的內存管理過程,可能容易產生過多的內存碎片,導致系統的不穩定。