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