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