本發(fā)明涉及一種基于DSS框架的數(shù)據(jù)庫子系統(tǒng)設(shè)計方法。
背景技術(shù):
Darwin Streaming Server簡稱DSS。DSS是Apple公司提供的開源實時流媒體播放服務(wù)器程序,整個程序使用純粹C++編寫,在設(shè)計上遵循高性能、簡單、模塊化等程序設(shè)計原則,務(wù)求做到程序高效,可擴充性好,因此DSS服務(wù)器系統(tǒng)在跨平臺的支持上是相當(dāng)理想的,它可以運行在Windows NT、Windows 2000及以上的windows內(nèi)核版本,同時也能良好的運行在*NIX的各種版本上,包括Mac OS X,Linux,F(xiàn)reeBSD,Solaris,同時DSS基于標(biāo)準(zhǔn)的流媒體協(xié)議RTSP,RTP/RTCP進(jìn)行開發(fā),因此在運用上具有極強的廣泛性和通用性。
在此基礎(chǔ)上,DSS框架設(shè)計成一個較為復(fù)雜的,層次結(jié)構(gòu)較為清晰的流媒體服務(wù)器系統(tǒng),主要由基礎(chǔ)功能組件(網(wǎng)絡(luò),字符串處理,內(nèi)存開辟釋放,模塊工具,內(nèi)部錯誤消息定義,全局?jǐn)?shù)據(jù)字典等等),各種子系統(tǒng)(RTSP,RTP,RTCP等等),各種功能插件(身份驗證,身份授權(quán),數(shù)據(jù)流預(yù)處理,數(shù)據(jù)流處理,HTTP隧道處理,服務(wù)器消息回復(fù)等等)組合而成,很多開發(fā)人員主要會進(jìn)行各種功能插件的開發(fā),在服務(wù)器啟動的時候進(jìn)行動態(tài)加載,當(dāng)主流程狀態(tài)機處理到相應(yīng)狀態(tài)的時候?qū)⒄{(diào)用對應(yīng)的插件,此時服務(wù)器將控制權(quán)交給插件進(jìn)行相應(yīng)功能運作。因此,在這個基礎(chǔ)上從使用結(jié)構(gòu)的角度上,服務(wù)器被分成兩個大塊,服務(wù)器內(nèi)部以及服務(wù)器外部,服務(wù)器內(nèi)部由各種基礎(chǔ)功能組件和子系統(tǒng)所組成,服務(wù)器外部由功能插件組成,這兩個部分之間通過函數(shù)指針設(shè)計成的API接口進(jìn)行數(shù)據(jù)的交互以及基礎(chǔ)功能的實現(xiàn)。
然而開發(fā)人員在進(jìn)行開發(fā)的過程中往往不止需要設(shè)計插件,同時也需要對服務(wù)器內(nèi)部進(jìn)行必要的功能增加或者修改,現(xiàn)有DSS框架對于音視頻數(shù)據(jù)流之外的數(shù)據(jù)來源均從配置文件中進(jìn)行加載,包括服務(wù)器啟動的大量配置參數(shù),子系統(tǒng)運行過程中需要的數(shù)據(jù),模塊插件所需要的數(shù)據(jù),例如對于身份驗證,對于接入IP段的限制等等,這在很大程度上對項目的實際使用造成極大的不方便,因此在DSS框架中加入數(shù)據(jù)庫的功能是實際項目運用中非常必要的,而現(xiàn)有的DSS框架中的數(shù)據(jù)庫功能設(shè)計較為簡單,并沒有根據(jù)DSS框架的分時特點,以及數(shù)據(jù)庫操作數(shù)據(jù)的及時性特點也就是在DSS分時框架中的需要另數(shù)據(jù)庫任務(wù)產(chǎn)生搶占功能,并且在保護(hù)好原來任務(wù)各種狀態(tài)的前提下中斷原來任務(wù),在成功從數(shù)據(jù)庫中獲取數(shù)據(jù)之后再恢復(fù)原來任務(wù),導(dǎo)致在使用上會出現(xiàn)各種意料之外的嚴(yán)重問題。為了避免這些問題,本發(fā)明綜合上述提到的服務(wù)器特點以及ODBC(Open Database connect 開放數(shù)據(jù)互連)方式的數(shù)據(jù)庫運用,詳細(xì)設(shè)計了基于DSS分時框架ODBC子系統(tǒng)功能。
技術(shù)實現(xiàn)要素:
本發(fā)明的一個目的在于提供一種基于DSS框架的數(shù)據(jù)庫子系統(tǒng)設(shè)計方法,解決了現(xiàn)有DSS框架下數(shù)據(jù)庫子系統(tǒng)任務(wù)搶占、功能簡單及其衍生的各類問題。
為了實現(xiàn)上述目的,本發(fā)明的技術(shù)方案如下:
一種基于DSS框架的數(shù)據(jù)庫子系統(tǒng)設(shè)計方法,包括以下步驟:
步驟1、在DSS組件結(jié)構(gòu)中設(shè)計數(shù)據(jù)庫任務(wù)線程類繼承自DSS系統(tǒng)線程類、設(shè)計數(shù)據(jù)庫任務(wù)類繼承自DSS任務(wù)類;該數(shù)據(jù)庫任務(wù)線程類作為數(shù)據(jù)庫線程組件用于以一條獨立且唯一的線程負(fù)責(zé)推送數(shù)據(jù)庫任務(wù),且該條線程負(fù)責(zé)維護(hù)一個任務(wù)堆,這個任務(wù)堆將最近時間片任務(wù)彈出送往實際工作線程;該數(shù)據(jù)庫任務(wù)類用于在DSS服務(wù)器啟動的時候調(diào)用靜態(tài)初始化函數(shù)啟動數(shù)據(jù)庫任務(wù)線程類中的線程,還用于調(diào)用數(shù)據(jù)庫任務(wù)類線程接口執(zhí)行數(shù)據(jù)庫任務(wù)的插入數(shù)據(jù)庫任務(wù)線程類中優(yōu)先隊列的操作以及用于維護(hù)任務(wù)的各種屬性和操作函數(shù),所述數(shù)據(jù)庫任務(wù)線程類和數(shù)據(jù)庫任務(wù)類互為友元類;
步驟2、在DSS子系統(tǒng)結(jié)構(gòu)中設(shè)計數(shù)據(jù)庫子系統(tǒng)類以及子系統(tǒng)執(zhí)行接口類;該數(shù)據(jù)庫子系統(tǒng)類子系統(tǒng)類首先是作為一個容器繼承自數(shù)據(jù)庫接口類,負(fù)責(zé)各種數(shù)據(jù)庫任務(wù)相關(guān)檢查以及最重要的運行函數(shù),該運行函數(shù)用于執(zhí)行實際的數(shù)據(jù)庫操作并且將執(zhí)行結(jié)果存放在DSS數(shù)據(jù)系統(tǒng)中的數(shù)據(jù)庫子系統(tǒng)數(shù)據(jù)字典中,為真正的重要執(zhí)行函數(shù);該數(shù)據(jù)庫接口負(fù)責(zé)執(zhí)行數(shù)據(jù)庫初始化工作以及全局?jǐn)?shù)據(jù)字典的初始化;
步驟3、在DSS框架的Private.h文件中的回調(diào)函數(shù)結(jié)構(gòu)中增加數(shù)據(jù)庫操作的回調(diào)函數(shù)定義;
在Callbacks.h文件中增加數(shù)據(jù)庫操作函數(shù)聲明,同時在Callbacks.cpp文件中增加聲明函數(shù);
在QTSS.h中引用數(shù)據(jù)庫操作函數(shù)的聲明;
在qtsserver.cpp中的初始化回調(diào)函數(shù)中完成對數(shù)據(jù)庫操作函數(shù)的函數(shù)指針賦值;完成由DSS框架內(nèi)部到DSS框架外部插件的API接口設(shè)計。
優(yōu)選的,所述步驟1中,在DSS組件結(jié)構(gòu)中的通用工具類庫中設(shè)計數(shù)據(jù)庫任務(wù)線程類繼承自DSS系統(tǒng)線程類、設(shè)計數(shù)據(jù)庫任務(wù)類繼承自DSS框架的任務(wù)類,數(shù)據(jù)庫任務(wù)線程類作為數(shù)據(jù)庫線程組件,是DSS框架中唯一運行的數(shù)據(jù)庫任務(wù)推動線程,也是構(gòu)成數(shù)據(jù)庫子系統(tǒng)的基礎(chǔ)組件。
優(yōu)選的,所述數(shù)據(jù)庫任務(wù)線程類包括一個堆數(shù)據(jù)結(jié)構(gòu)的成員變量,即優(yōu)先隊列,這個優(yōu)先隊列是由一完全二叉樹構(gòu)造而成,該完全二叉樹的父節(jié)點始終大于或者小于左右子節(jié)點,這個優(yōu)先隊列用于將時間片最近的數(shù)據(jù)庫任務(wù)推往樹根節(jié)點,同時也包括對于堆變量進(jìn)行搶占保護(hù)的堆互斥量以及驅(qū)動堆變量工作的堆信號量。
優(yōu)選的,所述數(shù)據(jù)庫任務(wù)線程類包括一個入口函數(shù),該函數(shù)用于判斷是否存在任務(wù)元素,當(dāng)任務(wù)堆長度是否大于0時存在任務(wù)元素,如果已經(jīng)存在任務(wù)元素,則入口函數(shù)再判斷當(dāng)前任務(wù)元素中的時間片是否已經(jīng)到達(dá)超時,如果當(dāng)前任務(wù)的時間片已經(jīng)超時則將當(dāng)前任務(wù)發(fā)送到DSS框架中的任務(wù)線程中進(jìn)行實際運行數(shù)據(jù)庫任務(wù);
所述數(shù)據(jù)庫任務(wù)線程類還包括一個執(zhí)行數(shù)據(jù)庫語句函數(shù),該執(zhí)行數(shù)據(jù)庫語句函數(shù)用于將數(shù)據(jù)庫任務(wù)指針推進(jìn)堆變量,同時增加長度,驅(qū)動任務(wù)線程類的入口函數(shù)進(jìn)行工作。
優(yōu)選的,所述數(shù)據(jù)庫任務(wù)類包括一個靜態(tài)初始化函數(shù)和封裝了數(shù)據(jù)庫任務(wù)線程類中真正執(zhí)行函數(shù)的執(zhí)行數(shù)據(jù)庫語句函數(shù),該靜態(tài)初始化函數(shù)在系統(tǒng)啟動過程中系統(tǒng)初始化函數(shù)時被調(diào)用,調(diào)用該靜態(tài)初始化函數(shù)時數(shù)據(jù)庫任務(wù)推送線程開始運行;
該執(zhí)行數(shù)據(jù)庫語句函數(shù)作為數(shù)據(jù)庫的API接口基礎(chǔ),在API將提供給DSS框架的外部插件使用時調(diào)用。
優(yōu)選的,所述數(shù)據(jù)庫任務(wù)類包括堆成員類,堆成員類作為數(shù)據(jù)庫任務(wù)類的成員變量,也作為數(shù)據(jù)庫任務(wù)線程類這個友元類的成員變量,堆成員變量具有保存任務(wù)指針的變量以及當(dāng)前任務(wù)時間片的超時時間;
所述數(shù)據(jù)庫任務(wù)類還包括數(shù)據(jù)庫任務(wù)事件枚舉結(jié)構(gòu),在任務(wù)事件枚舉結(jié)構(gòu)中定義當(dāng)數(shù)據(jù)庫任務(wù)實際被送入DSS工作線程運行時需要執(zhí)行的事件定義。
優(yōu)選的,數(shù)據(jù)庫接口包括一個靜態(tài)初始化函數(shù),該靜態(tài)初始化函數(shù)在數(shù)據(jù)庫子系統(tǒng)正式啟動之前預(yù)先調(diào)用,負(fù)責(zé)對數(shù)據(jù)庫子系統(tǒng)的相關(guān)數(shù)據(jù)進(jìn)行全局?jǐn)?shù)據(jù)字典的開辟,這些數(shù)據(jù)字典將在DSS框架內(nèi)部和外部插件進(jìn)行交互使用。
優(yōu)選的,所述步驟2中,在DSS子系統(tǒng)結(jié)構(gòu)的Server.tproj結(jié)構(gòu)中設(shè)計數(shù)據(jù)庫子系統(tǒng)類,這個類繼承自數(shù)據(jù)庫接口以及DSS框架中的變長字符串格式化類。數(shù)據(jù)庫類將作為真正的任務(wù)載體送入DSS框架的工作線程中運行;
所述步驟3之后還包括步驟4:在DSS子系統(tǒng)結(jié)構(gòu)的Server.tproj結(jié)構(gòu)中設(shè)計數(shù)據(jù)庫子系統(tǒng)的接口類,該接口類繼承自字典類以及數(shù)據(jù)庫任務(wù)類,其中字典類為DSS框架中的數(shù)據(jù)字典類,這該接口類用于提供執(zhí)行數(shù)據(jù)庫方式的數(shù)據(jù)庫操作中的各種操作接口,還用于保存數(shù)據(jù)庫中各個屬性參數(shù)的值,以及用于保存著數(shù)據(jù)庫任務(wù)執(zhí)行之后的返回結(jié)果集。
優(yōu)選的,數(shù)據(jù)庫包括一個靜態(tài)初始化函數(shù)、一個真正任務(wù)執(zhí)行函數(shù)以及運行函數(shù),該靜態(tài)初始化函數(shù)進(jìn)行任務(wù)的輔助信息初始化;該真正任務(wù)執(zhí)行函數(shù)在DSS框架工作線程中將被提取出來執(zhí)行;該運行函數(shù)執(zhí)行數(shù)據(jù)庫方式下的數(shù)據(jù)庫操作,數(shù)據(jù)庫操作為:首先獲取SQL語句,然后送入數(shù)據(jù)庫語句執(zhí)行函數(shù)中,接著獲取執(zhí)行結(jié)果集計數(shù)以及最后結(jié)果存放進(jìn)數(shù)據(jù)庫接口中的數(shù)據(jù)字典變量;
對于數(shù)據(jù)庫運行函數(shù)的結(jié)果集使用DSS框架中可變長度的字符串格式化類,這個類在構(gòu)造函數(shù)的時候?qū)_辟預(yù)定于大小的空間用于存放結(jié)果集,如果結(jié)果集大于預(yù)定于大小的空間會自動開辟2倍原大小的空間。
優(yōu)選的,對于數(shù)據(jù)庫操作函數(shù):執(zhí)行數(shù)據(jù)庫語句內(nèi)部實現(xiàn)中使用數(shù)據(jù)庫對象指向?qū)嶋H執(zhí)行數(shù)據(jù)庫語句的參數(shù)默認(rèn)為0,也即另數(shù)據(jù)庫任務(wù)需要從堆中立即被推進(jìn)實際工作線程,同時回到調(diào)用模塊中,數(shù)據(jù)庫的API一旦調(diào)用就要使用返回一個以毫秒為單位的數(shù)值進(jìn)行中斷當(dāng)前任務(wù)模塊。
采用上述方案后,本發(fā)明的有益效果是:本發(fā)明根據(jù)DSS框架的分時特點,以及數(shù)據(jù)庫操作數(shù)據(jù)的及時性特點,設(shè)計的數(shù)據(jù)庫子系統(tǒng)設(shè)計方法,解決了現(xiàn)有DSS框架下數(shù)據(jù)庫子系統(tǒng)任務(wù)搶占、功能簡單及其衍生的各類問題,設(shè)計的數(shù)據(jù)庫子系統(tǒng)可在DSS框架內(nèi)部方便的使用數(shù)據(jù)庫操作,并且開放出完善的數(shù)據(jù)庫API操作接口提供給DSS框架外部插件,使得基于DSS框架的開發(fā)更加便捷,更符合實際項目的運用。
以下結(jié)合附圖和具體實施方式對本發(fā)明做進(jìn)一步說明。
附圖說明
圖1:本發(fā)明數(shù)據(jù)庫在DSS框架中的組件結(jié)構(gòu)示意圖;
圖2;本發(fā)明數(shù)據(jù)庫子系統(tǒng)在DSS框架中的結(jié)構(gòu)示意圖;
圖3-1;本發(fā)明數(shù)據(jù)庫子系統(tǒng)在DSS框架中驅(qū)動狀態(tài)示意圖;
圖3-2為將時間片超時的任務(wù)推送進(jìn)任務(wù)類任務(wù)線程狀態(tài)示意圖(等待13毫秒時間值任務(wù)已經(jīng)到達(dá),推送出去執(zhí)行);
圖3-3為將根據(jù)優(yōu)先隊列方式的等待14毫秒時間值任務(wù)推到樹根狀態(tài)示意圖;
圖3-4:對空節(jié)點進(jìn)行補充示意圖;
圖3-5:再次形成一完整隊列狀態(tài)示意圖;
圖4:本發(fā)明數(shù)據(jù)子系統(tǒng)在DSS外部插件中運行示意圖。
具體實施方式
如圖1所示,本發(fā)明揭示的一種基于DSS框架的數(shù)據(jù)庫子系統(tǒng)設(shè)計方法,包括以下步驟:
第一步:在DSS組件結(jié)構(gòu)(通用工具類庫CommonUtlitiesLib )中設(shè)計數(shù)據(jù)庫任務(wù)線程類(ODBCTaskThread)繼承自DSS系統(tǒng)線程類(OSThread),設(shè)計數(shù)據(jù)庫任務(wù)類(ODBCTask)繼承自DSS任務(wù)類(Task),數(shù)據(jù)庫任務(wù)線程以一條獨立的唯一的線程負(fù)責(zé)推送數(shù)據(jù)庫任務(wù),這條線程主要維護(hù)一個任務(wù)堆(優(yōu)先隊列),這條線程將堆中最近時間片任務(wù)彈出送往實際工作線程:
上述數(shù)據(jù)庫任務(wù)線程類和數(shù)據(jù)庫任務(wù)類互為友元類,數(shù)據(jù)庫任務(wù)線程類作為數(shù)據(jù)庫線程組件,是DSS框架中唯一運行的數(shù)據(jù)庫任務(wù)推動線程,也是構(gòu)成數(shù)據(jù)庫子系統(tǒng)的基礎(chǔ)組件;
第二步:在DSS子系統(tǒng)結(jié)構(gòu)(Server.tproj)中設(shè)計數(shù)據(jù)庫子系統(tǒng)類(QTSSODBC)以及子系統(tǒng)執(zhí)行接口類(QTSSODBCInterface);數(shù)據(jù)庫子系統(tǒng)類首先是作為一個容器繼承自數(shù)據(jù)庫接口類,負(fù)責(zé)各種數(shù)據(jù)庫任務(wù)相關(guān)檢查以及最重要的運行函數(shù)(Run),這個函數(shù)主要執(zhí)行實際的數(shù)據(jù)庫操作并且將結(jié)果存放在DSS數(shù)據(jù)系統(tǒng)中的數(shù)據(jù)庫子系統(tǒng)數(shù)據(jù)字典,是真正的重要執(zhí)行函數(shù):
第三步:對于數(shù)據(jù)庫接口類,它繼承自數(shù)據(jù)庫任務(wù)類,數(shù)據(jù)庫任務(wù)類則再次繼承于DSS任務(wù)類,同時,任務(wù)類與系統(tǒng)線程類互為友元類,在服務(wù)器初始化的時候,數(shù)據(jù)庫任務(wù)類將會調(diào)用靜態(tài)初始化函數(shù)開始啟動數(shù)據(jù)庫線程,同時因為系統(tǒng)線程類的入口函數(shù)為虛函數(shù),因此數(shù)據(jù)庫線程將運行自己的唯一線程,也就是數(shù)據(jù)庫任務(wù)推送線程(將數(shù)據(jù)庫任務(wù)推送進(jìn)堆變量優(yōu)先隊列中):
第四步:任務(wù)類線程一直處于等待狀態(tài)中,它會等待兩種任務(wù)狀態(tài)的到來,一種是在任務(wù)執(zhí)行過程中返回大于0值的任務(wù),這種類型的任務(wù)將被存放在堆變量類型(優(yōu)先隊列)的任務(wù)隊列里,當(dāng)時間片到達(dá)的時候,將優(yōu)先彈出這個隊列中的任務(wù)進(jìn)行運行;第二種是普通任務(wù)的投遞,這種類型的任務(wù)被投遞到正常的任務(wù)隊列中,當(dāng)優(yōu)先隊列中不存在任務(wù)的時候?qū)⒉檎疫@個普通任務(wù)隊列是否有時間片超時的任務(wù),如果有的話則開始運行對應(yīng)的運行函數(shù):
第五步、如圖2所示:當(dāng)有一個需要被數(shù)據(jù)庫操作中斷的任務(wù)在任務(wù)類線程中執(zhí)行的時候,她會返回一個以毫秒為單位的值將自己進(jìn)行中斷,中斷之后任務(wù)類任務(wù)線程將會將其送進(jìn)任務(wù)類線程中的堆變量(優(yōu)先隊列中),下一次當(dāng)返回值(時間片超時)到達(dá)的時候,任務(wù)類將優(yōu)先執(zhí)行優(yōu)先隊列中的任務(wù),只有當(dāng)優(yōu)先隊列中的任務(wù)執(zhí)行完之后才會執(zhí)行普通任務(wù)隊列中的任務(wù)。因此當(dāng)前任務(wù)被搶占之后,將開始優(yōu)先執(zhí)行搶占任務(wù)也就是數(shù)據(jù)庫數(shù)據(jù)庫任務(wù)的真正執(zhí)行者運行函數(shù)。最后當(dāng)數(shù)據(jù)庫數(shù)據(jù)庫任務(wù)執(zhí)行完成之后,數(shù)據(jù)通過數(shù)據(jù)字典送進(jìn)數(shù)據(jù)區(qū),重新等待原先被搶占的任務(wù)執(zhí)行,此時原先任務(wù)將獲得數(shù)據(jù)庫數(shù)據(jù):
數(shù)據(jù)庫任務(wù)線程類還包括一個執(zhí)行數(shù)據(jù)庫語句函數(shù),該執(zhí)行數(shù)據(jù)庫語句函數(shù)用于將數(shù)據(jù)庫任務(wù)指針推進(jìn)堆變量,同時增加長度,驅(qū)動任務(wù)線程類的入口函數(shù)進(jìn)行工作
第六步、如圖3系列(圖3-1、3-2、3-3、3-4)所示:任務(wù)類線程中的入口函數(shù)如何將時間片已經(jīng)到達(dá)的任務(wù)推送到任務(wù)類任務(wù)線程執(zhí)行的過程,圖3系列所示是如何使用優(yōu)先隊列的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)優(yōu)先級任務(wù)推送,優(yōu)先隊列是計算機科學(xué)中的一類抽象數(shù)據(jù)類型,優(yōu)先隊列中的每個元素都有各自的優(yōu)先級,優(yōu)先級最高的元素最先得到服務(wù);優(yōu)先級相同的元素按照其在優(yōu)先隊列中的順序得到服務(wù),優(yōu)先隊列往往用堆來實現(xiàn)。在本發(fā)明中,優(yōu)先隊列的優(yōu)先級用任務(wù)中斷后再次運行所需要等待的時間片表示,圖3系列中如果所有節(jié)點的時間值(優(yōu)先隊列中元素的優(yōu)先級)為0的話則表示數(shù)據(jù)庫任務(wù)將立即被執(zhí)行,如果為其他數(shù)值,則表示被中斷的任務(wù)需要等待多久的時間片再次被執(zhí)行。
第七步、如圖4所示:在DSS框架Private.h文件中的回調(diào)函數(shù)結(jié)構(gòu)中增加數(shù)據(jù)庫數(shù)據(jù)庫操作的回調(diào)函數(shù)定義,接著在Callbacks.h中增加數(shù)據(jù)庫數(shù)據(jù)庫操作函數(shù)聲明,同時在Callbacks.cpp中實現(xiàn)聲明函數(shù),在QTSS.h中引用數(shù)據(jù)庫操作函數(shù)的聲明,最后在qtsserver.cpp中的初始化回調(diào)函數(shù)中完成對數(shù)據(jù)庫操作函數(shù)的函數(shù)指針賦值,完成由DSS框架內(nèi)部到DSS框架外部插件的API接口設(shè)計。當(dāng)系統(tǒng)外部插件需要使用數(shù)據(jù)庫功能,則調(diào)用系統(tǒng)內(nèi)定義好的API接口,同時對數(shù)據(jù)字典進(jìn)行搶占安全保護(hù)。
本發(fā)明上述Private.h文件、Callbacks.h文件、Callbacks.cpp文件均是DSS框架中已有定義文件,均分別具備其特有功能。
優(yōu)選的,數(shù)據(jù)庫任務(wù)線程類包括一個堆(堆變量、heap)數(shù)據(jù)結(jié)構(gòu)的成員變量,即優(yōu)先隊列,這個優(yōu)先隊列是由一完全二叉樹構(gòu)造而成,該完全二叉樹的父節(jié)點始終大于或者小于左右子節(jié)點,這個優(yōu)先隊列用于將時間片最近的數(shù)據(jù)庫任務(wù)推往樹根節(jié)點,同時也包括對于堆變量進(jìn)行搶占保護(hù)的堆互斥量(heapMutex)以及驅(qū)動堆變量工作的堆信號量(heapCond)。
優(yōu)選的,所述數(shù)據(jù)庫任務(wù)線程類包括一個入口函數(shù)(Entry()),該函數(shù)用于判斷是否存在任務(wù)元素,當(dāng)任務(wù)堆長度是否大于0時存在任務(wù)元素,如果已經(jīng)存在任務(wù)元素,則入口函數(shù)再判斷當(dāng)前任務(wù)元素中的時間片是否已經(jīng)到達(dá)超時,如果當(dāng)前任務(wù)的時間片已經(jīng)超時則將當(dāng)前任務(wù)發(fā)送到DSS框架中的任務(wù)線程中進(jìn)行實際運行數(shù)據(jù)庫任務(wù);任務(wù)類線程一直處于等待狀態(tài)中,她會等待兩種任務(wù)狀態(tài)的到來,一種是在任務(wù)執(zhí)行過程中返回大于0值的任務(wù),這種類型的任務(wù)將被存放在堆變量類型(優(yōu)先隊列)的任務(wù)隊列里,當(dāng)時間片到達(dá)的時候,將優(yōu)先彈出這個隊列中的任務(wù)進(jìn)行運行。第二種是普通任務(wù)的投遞,這種類型的任務(wù)被投遞到正常的任務(wù)隊列中,當(dāng)優(yōu)先隊列中不存在任務(wù)的時候?qū)⒉檎疫@個普通任務(wù)隊列是否有時間片超時的任務(wù),如果有的話則開始運行對應(yīng)的運行函數(shù)。
優(yōu)選的,所述數(shù)據(jù)庫任務(wù)類包括一個靜態(tài)初始化函數(shù)(static void Initialize())和封裝了數(shù)據(jù)庫任務(wù)線程類中真正執(zhí)行函數(shù)的執(zhí)行數(shù)據(jù)庫語句函數(shù),該靜態(tài)初始化函數(shù)在系統(tǒng)啟動過程中系統(tǒng)初始化函數(shù)時被調(diào)用,調(diào)用該靜態(tài)初始化函數(shù)時數(shù)據(jù)庫任務(wù)推送線程開始運行;
該執(zhí)行數(shù)據(jù)庫語句函數(shù)作為數(shù)據(jù)庫的API接口基礎(chǔ),在API將提供給DSS框架的外部插件使用時調(diào)用。
優(yōu)選的,所述數(shù)據(jù)庫任務(wù)類包括堆成員類,堆成員類作為數(shù)據(jù)庫任務(wù)類(指針)的成員變量,也作為數(shù)據(jù)庫任務(wù)線程類這個友元類的成員變量,堆成員變量具有保存任務(wù)指針的變量以及當(dāng)前任務(wù)時間片的超時時間;
所述數(shù)據(jù)庫任務(wù)類還包括數(shù)據(jù)庫任務(wù)事件枚舉結(jié)構(gòu),在任務(wù)事件枚舉結(jié)構(gòu)中定義當(dāng)數(shù)據(jù)庫任務(wù)實際被送入DSS工作線程運行時需要執(zhí)行的事件定義。
優(yōu)選的,數(shù)據(jù)庫接口包括一個靜態(tài)初始化函數(shù),該靜態(tài)初始化函數(shù)在數(shù)據(jù)庫子系統(tǒng)正式啟動之前預(yù)先調(diào)用,負(fù)責(zé)對數(shù)據(jù)庫子系統(tǒng)的相關(guān)數(shù)據(jù)進(jìn)行全局?jǐn)?shù)據(jù)字典的開辟,這些數(shù)據(jù)字典將在DSS框架內(nèi)部和外部插件進(jìn)行交互使用。
優(yōu)選的,數(shù)據(jù)庫包括一個靜態(tài)初始化函數(shù)、一個真正任務(wù)執(zhí)行函數(shù)以及運行函數(shù),該靜態(tài)初始化函數(shù)進(jìn)行任務(wù)的輔助信息初始化;該真正任務(wù)執(zhí)行函數(shù)在DSS框架工作線程中將被提取出來執(zhí)行;該運行函數(shù)執(zhí)行數(shù)據(jù)庫方式下的數(shù)據(jù)庫操作,數(shù)據(jù)庫操作為:首先獲取SQL語句,然后送入數(shù)據(jù)庫語句執(zhí)行函數(shù)中,接著獲取執(zhí)行結(jié)果集計數(shù)以及最后結(jié)果存放進(jìn)數(shù)據(jù)庫接口中的數(shù)據(jù)字典變量;
對于數(shù)據(jù)庫運行函數(shù)的結(jié)果集使用DSS框架中可變長度的字符串格式化類,這個類在構(gòu)造函數(shù)的時候?qū)_辟預(yù)定于大小的空間用于存放結(jié)果集,如果結(jié)果集大于預(yù)定于大小的空間會自動開辟2倍原大小的空間。
優(yōu)選的,對于數(shù)據(jù)庫操作函數(shù):執(zhí)行數(shù)據(jù)庫語句內(nèi)部實現(xiàn)中使用數(shù)據(jù)庫對象指向?qū)嶋H執(zhí)行數(shù)據(jù)庫語句的參數(shù)默認(rèn)為0,也即另數(shù)據(jù)庫任務(wù)需要從堆中立即被推進(jìn)實際工作線程,同時回到調(diào)用模塊中,數(shù)據(jù)庫的API一旦調(diào)用就要使用返回一個以毫秒為單位的數(shù)值進(jìn)行中斷當(dāng)前任務(wù)模塊,因為數(shù)據(jù)庫任務(wù)開始搶占,對于以毫秒為單位返回的這個值就是原任務(wù)需要等待重新執(zhí)行的時間,這個時間需要根據(jù)當(dāng)前需要對數(shù)據(jù)庫操作的時間進(jìn)行判斷后設(shè)置,防止發(fā)生嵌套任務(wù)。
以上僅為本發(fā)明的具體實施例,并非對本發(fā)明的保護(hù)范圍的限定。凡依本案的設(shè)計思路所做的等同變化,均落入本案的保護(hù)范圍。