李 瑞 徐承志
(湖北工業(yè)大學計算機學院 湖北 武漢 430068)
?
一種基于Virtools平臺的數(shù)據(jù)庫插件開發(fā)與應用
李瑞徐承志
(湖北工業(yè)大學計算機學院湖北 武漢 430068)
摘要針對Virtools平臺中傳統(tǒng)數(shù)據(jù)庫解決方案存在的配置Virtools Server復雜、開發(fā)不便、維護困難等問題,提出一種基于Virtools SDK和ADO技術相結(jié)合的數(shù)據(jù)庫插件開發(fā)方案?;谠摲桨搁_發(fā)的數(shù)據(jù)庫插件具有較強的可重用性,具備靈活的數(shù)據(jù)庫連接方式和完備的訪問機制。實踐證明,該方案擴展了Virtools訪問數(shù)據(jù)庫的功能,對比Virtools自帶的Virtools Server,具有更高的訪問效率、更簡潔的訪問流程,使得數(shù)據(jù)庫相關的開發(fā)工作更加便利。
關鍵詞Virtools ServerVirtools SDKADO
0引言
Virtools是一款應用廣泛的3D環(huán)境與事件交互的開發(fā)軟件,Virtools平臺包括一個腳本編輯器、一個行為引擎、一個渲染引擎、一個Web播放器和一組軟件開發(fā)包(SDK)[1,2]。Behavior Building Block(BB)是用來執(zhí)行特定動作的可視化功能模塊,開發(fā)人員透過可視化的開發(fā)界面,以類似流程圖的方式拖放行為模塊BB到需要的對象上,最終可建構(gòu)起豐富的交互式應用程序[3,4]。然而正是由于該軟件在多領域的適用性,造成該軟件在某些功能設計上無法精細,比如:Virtools自帶的操作數(shù)據(jù)庫BB就需要用戶具有較高的專業(yè)背景,和較高的操作技巧,導致用戶使用起來不太方便。這時可以通過Virtools SDK 開發(fā)出輕量級的BB模塊來完成相同的工作。
本文作者參與國家級大學生創(chuàng)新創(chuàng)業(yè)項目—“基于虛擬校園的軟件生態(tài)系統(tǒng)研究”,由于該項目中包含大量的建筑物、用戶、相關活動等數(shù)據(jù)信息,處理數(shù)據(jù)的操作也相對復雜,因此根據(jù)項目需要,作者自主開發(fā)了輕量級的數(shù)據(jù)庫BB插件。
1Virtools自帶BB的缺陷
利用Virtools平臺自帶的數(shù)據(jù)庫BB訪問數(shù)據(jù)庫時,要安裝自帶的服務器組件Virtools Server:這是架構(gòu)在TCP/IP協(xié)議上的C/S系統(tǒng),專門針對Virtools軟件在網(wǎng)絡層上的應用[5]。訪問數(shù)據(jù)庫的步驟:
① 配置Virtools Server。
② 將ODBC數(shù)據(jù)源綁定到Virtools Server端。
③ 通過“Connect to Server” BB連接Virtools Server;并用“getfromDatabase”, “ExecuteSQL Statement”等數(shù)據(jù)庫BB執(zhí)行相關操作。
Virtools Server工作的主要目的是給Virtools的開發(fā)者提供一個能夠與網(wǎng)絡上的其他用戶或是服務器溝通的界面,所有的資料交換動作都必須通過Virtools Server來進行。基于Virtools和Virtools Server的系統(tǒng)對于普通用戶來說,安裝過程十分繁瑣,需要先進行Virtools Server的安裝、配置和啟動,系統(tǒng)才能訪問數(shù)據(jù)庫。這不僅會加重系統(tǒng)開發(fā)人員的負擔,降低人機的友好程度,使得系統(tǒng)的靈活性受到了一定的限制。為了解決這一問題,可以利用Virtools SDK進行自主BB插件開發(fā)。
2Virtools SDK及BB插件開發(fā)概述
2.1Virtools SDK
Virtools SDK處于Virtools的最底層,提供了Virtools軟件所有的底層函數(shù),通過SDK開發(fā)BB插件(Behavior Plug-in),可以很容易地訪問Virtools API,并可直接使用這些功能函數(shù)編寫相關組件,同時還可以擴展Virtools引擎[6]。其插件開發(fā)架構(gòu)圖如圖 1所示。其中,Virtools SDK關鍵部分是行為庫(CK2)和數(shù)學庫(VxMath)。數(shù)學庫提供底層的函數(shù);行為庫提供 SDK 開發(fā)時的基本規(guī)范,并且負責組織和管理其他引擎模塊[7]。
圖1 插件開發(fā)架構(gòu)圖
2.2BB插件的開發(fā)過程
BB插件的開發(fā)過程一共分3個步驟:
① 配置開發(fā)環(huán)境。Virtools SDK的版本對編譯環(huán)境有不同的要求,首先選擇相應的VS版本,然后導入Virtools SDK頭文件和類庫即可。
② BB的功能實現(xiàn)。通過向?qū)葿B代碼框架,然后根據(jù)實際業(yè)務需求在其中插入邏輯代碼。
③ 編譯生成BB。編寫、調(diào)試完畢,生成Behavior Plug-in(.dll文件),將其拷貝到項目工程中的Building Blocks目錄中即可使用[8]。
下面介紹BB插件的具體設計思路和實現(xiàn)細節(jié)。
3輕量級數(shù)據(jù)庫插件開發(fā)
3.1ADO技術
為了避免使用Virtools Server而產(chǎn)生的繁瑣過程,并使訪問數(shù)據(jù)庫的操作更加簡單靈活,可以采用封裝了ADO技術的BB來訪問數(shù)據(jù)庫。
ADO是為Microsoft最新和最強大的數(shù)據(jù)訪問接口OLE DB[9]而設計的,是一個便于使用的應用程序?qū)?。OLE DB為任何數(shù)據(jù)源都提供了高性能的訪問,但使用時候需要添加很多代碼,使用復雜。ADO 是高層數(shù)據(jù)庫訪問技術,相對于ODBC來說,具有速度快、面向?qū)ο蟮奶攸c[10]。
3.2數(shù)據(jù)庫插件框架設計
數(shù)據(jù)庫插件的框架共有三個模塊:Connection模塊(取得數(shù)據(jù)庫連接),Operation模塊(操作數(shù)據(jù)庫),Disconnection模塊(斷開數(shù)據(jù)庫連接)。這三個模塊的關系框架如圖 2所示。
圖2 數(shù)據(jù)庫插件框架圖
為了提高訪問數(shù)據(jù)庫BB模塊操作的效率,需要這三個模塊可以共享_ConnectionPtr這個連接數(shù)據(jù)庫對象,而不必在每個BB中都要進行一次數(shù)據(jù)源的連接。但是Virtools SDK只有類似String、Int、Float等基本類型的參數(shù),并沒有_ConnectionPtr這個智能指針類型,因此用普通的參數(shù)輸出方法就無法達到這種效果。為了解決這個問題,可以將_ConnectionPtr對象存入線性容器——“連接池”。
連接池的數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct
{_ConnectionPtr m_pConnection;
//智能指針對象
bool IsConnected;
//標記數(shù)據(jù)源是否連接
}ConnectionPool;
ConnectionPool ConP[MAX];
//存放連接對象的一維數(shù)組
然后在每個BB工程文件中用共享變量的方式來申明這個連接池對象(使用external關鍵字),這樣就可以實現(xiàn)_ConnectionPtr智能指針在多個BB之間的共享,而且可以同時連接多個數(shù)據(jù)源。該連接池的效果如圖3所示。
圖3 _ConnectionPtr對象連接池
3.3插件的實現(xiàn)
(1) Connection模塊
Connection BB的功能是建立數(shù)據(jù)源的連接。其設計如圖4所示,其參數(shù)說明如表1所示。
圖4 Connection BB
參數(shù)類型參數(shù)名稱數(shù)據(jù)類型參數(shù)作用InstrConString連接數(shù)據(jù)源的字符串InUIDString用戶名InPWDString密碼OutInfoString連接操作反饋后的結(jié)果OutIndexint生成對應數(shù)據(jù)源的索引
實現(xiàn)步驟如下:
① 從輸入端(In)獲得數(shù)據(jù)源的連接字符串(strCon),用戶名(UID),密碼(PWD)這三個參數(shù)。
② 從連接池中取出一個斷開狀態(tài)的_ConnectionPtr對象,調(diào)用Open()方法,并利用第一步中的三個參數(shù)建立目標數(shù)據(jù)源的連接。
③ 如果連接成功,則返回該數(shù)據(jù)源的索引,設置輸出參數(shù)(Out)的反饋信息為”Success”,并觸發(fā)”Success”出口;否則設置輸出參數(shù)(Out)的反饋信息為”Failed”,并觸發(fā)”Failed”出口。
(2) Operation模塊
Operation模塊共包含兩個BB:ExecuteSQL BB和SelectSQL BB。ExecuteSQL BB執(zhí)行的是DDL(數(shù)據(jù)定義語言)和DML(數(shù)據(jù)操作語言),其中DDL包括CREATE DATABASE、CREATE TABLE、ALTER TABLE等操作,DML包括UPDATE、INSERT、DELETE等操作;SelectSQL BB執(zhí)行的是DQL(數(shù)據(jù)查詢語言),包括SELECT等操作[11]。
ExecuteSQL BB的設計如圖 5(a)所示,其參數(shù)說明如表2所示。
圖5 Operation模塊
參數(shù)類型參數(shù)名稱數(shù)據(jù)類型參數(shù)作用InIndexint目標數(shù)據(jù)源的索引InDDL/DMLString執(zhí)行的SQL語句OutInfoString執(zhí)行操作反饋的結(jié)果
實現(xiàn)步驟如下:
① 從輸入端(In)獲得要訪問數(shù)據(jù)源的索引(Index)和待執(zhí)行的SQL語句(DDL/DML)。
② 利用索引在連接池中獲得與目標數(shù)據(jù)源的連接對象(_ConnectionPtr),調(diào)用此對象的Execute方法執(zhí)行SQL。
③ 如果執(zhí)行成功,設置輸出參數(shù)(Out)的反饋信息”ExecuteSQL success”,并觸發(fā)”Success”出口;否則,設置輸出參數(shù)(Out)的反饋信息”ExecuteSQL Failed”,并觸發(fā)”Failed”出口。
SelectSQL BB的設計如圖 5(b)所示,其參數(shù)說明如表3所示。表中,DataArray是個類似數(shù)據(jù)庫中表的數(shù)據(jù)結(jié)構(gòu),列定義了數(shù)據(jù)類型,行包含對應數(shù)據(jù)類型的值。
表3 SelectSQL BB參數(shù)說明
(3) Disconnection模塊
Disconnection BB的功能是斷開數(shù)據(jù)源連接,避免資源浪費。其設計如圖6所示,其參數(shù)說明如表4所示。
圖6 Disconnection BB
參數(shù)類型參數(shù)名稱數(shù)據(jù)類型參數(shù)作用InIndexint目標數(shù)據(jù)源的索引OutInfoString執(zhí)行操作反饋的結(jié)果
實現(xiàn)步驟如下:
① 從輸入端(In)獲得要斷開數(shù)據(jù)源的索引(Index)。
② 利用索引在連接池中獲得目標數(shù)據(jù)源的連接對象(_ConnectionPtr),調(diào)用此對象的Close()方法。
③ 如果執(zhí)行成功,設置輸出參數(shù)(Out)的反饋信息”This datasourse has already disconnected”,并觸發(fā)”Success”出口;否則,設置輸出參數(shù)(Out)的反饋信息”Unknown Error”,觸發(fā)”Failed”出口。
4實現(xiàn)效果及對比分析
4.1插件應用
圖7所示為“基于虛擬校園的軟件生態(tài)系統(tǒng)研究”項目中加載數(shù)據(jù)庫中建筑物信息到Array中的腳本程序。設置數(shù)據(jù)源的連接字符串為“Provider = Microsoft.Jet.OLEDB.4.0;Data Source = VirtualSchool.mdb”; 因為Access數(shù)據(jù)庫沒有用戶名和密碼,所以UID和PWD都設置為空。這樣就可以取得VirtualSchool.mdb數(shù)據(jù)源連接,同時Connection BB就將得到的數(shù)據(jù)源索引傳入到SelectSQL BB的Index輸入?yún)?shù),將SQL語句設為“select * from BuildingInfo”,就可以得到BuildingInfo表中所有的內(nèi)容,并將其保存到TargetArray中,圖8所示為TargetArray中的數(shù)據(jù)。
圖7 加載數(shù)據(jù)庫信息腳本程序
圖8 TargetArray中保存BuildingInfo表中數(shù)據(jù)
4.2對比分析
下面進行改進前后訪問數(shù)據(jù)庫操作優(yōu)劣的綜合分析:
(1) 數(shù)據(jù)庫加載方式的比較
① Virtools Server:Virtools自帶的建立數(shù)據(jù)源連接模塊需要配置Virtools Server和綁定ODBC(如圖9、圖10所示),同時在Virtools中建立與數(shù)據(jù)庫表中字段一一對應的數(shù)組Array,最后通過”Connect to Server” BB(指定連接數(shù)據(jù)庫的參數(shù))加載數(shù)據(jù)源。
圖9 配置virtools Server界面
圖10 綁定數(shù)據(jù)源界面
② 自帶插件:改進后只需將.dll文件拷貝到插件目錄下即可使用,在”Connection” BB中設置對應連接數(shù)據(jù)源字符串。
Virtools Server是獨立的中間件,購買費用十分昂貴,同時Virtools Server安裝配置過程十分繁瑣。由此可見改進后的數(shù)據(jù)庫插件技術更加簡易、靈活。
(2) 數(shù)據(jù)源選擇的比較
① Virtools Server:只支持ODBC訪問接口,此數(shù)據(jù)源需要用戶手動配置。
② 自帶插件:結(jié)合Virtools SDK在BB插件中封裝ADO的訪問數(shù)據(jù)庫技術支持可以多種數(shù)據(jù)源訪問接口。
ODBC訪問接口的可擴展性差,而且只支持關系型數(shù)據(jù)庫;而由于ADO訪問接口的可擴展性強,能統(tǒng)一訪問關系和非關系型數(shù)據(jù)庫,使得改進后BB能夠讀取更多種類的數(shù)據(jù)源。
(3) 數(shù)據(jù)操作的比較
① Virtools Server:自帶的”Execute SQL Statement” BB不能執(zhí)行DDL等SQL語句。
② 自帶插件:改進后的操作數(shù)據(jù)模塊可以執(zhí)行所有的SQL語句。
自主開發(fā)的操作數(shù)據(jù)庫插件擴展性強,功能完整,降低了數(shù)據(jù)庫系統(tǒng)和Virtools應用的耦合度。
(4) 數(shù)據(jù)源管理的比較
① Virtools Server:在Virtools Server中能夠設置并顯示允許連接Server最大的數(shù)量,響應的最長時間,甚至是某段范圍內(nèi)IP的訪問權限。
② 自帶插件:改進后的插件技術缺少對數(shù)據(jù)源管理的功能。
利用Virtools Server訪問數(shù)據(jù)庫方便數(shù)據(jù)源的管理與監(jiān)控,安全性較高。
表5所示為兩種訪問數(shù)據(jù)庫的4個方面的比較。Virtools Server主要用于網(wǎng)絡層的數(shù)據(jù)訪問,功能雖然強大,但繁瑣受限。由此可以看出,自主開發(fā)的插件對于輕量級的應用是十分方便可行的。
表5 兩種訪問數(shù)據(jù)庫方式的比較
5結(jié)語
該項方案利用Virtools SDK和ADO技術開發(fā)了更加方便的訪問數(shù)據(jù)庫BB插件。該插件在訪問數(shù)據(jù)庫時避開了Virtools Server的配置,使得代碼實現(xiàn)更加簡易;同時還擴展了數(shù)據(jù)庫連接方式,增加了對數(shù)據(jù)定義語言(DDL)的支持,使得開發(fā)操作更加靈活方便。有別于其他解決方案,該方案成功引入_ConnectionPtr對象連接池的概念,使得自主開發(fā)的數(shù)據(jù)庫BB可以共享數(shù)據(jù)源的連接,提高了BB的利用率,減輕了系統(tǒng)的負擔,特別在多數(shù)據(jù)源的情況下,優(yōu)勢更為明顯。然而,該方案依然存在改進的空間,即以共享變量來實現(xiàn)不同BB間的數(shù)據(jù)共享會破壞對象的封裝性,不利于對象的管理。在今后的工作中,怎么更好地實現(xiàn)復雜數(shù)據(jù)類型在Virtools的共享仍然值得探索。
參考文獻
[1] 方利偉.基于Virtools的三維虛擬實驗室研究與實現(xiàn)[J].實驗技術與管理,2010,27(5):83-86.
[2] 李昌國,朱福全,譚良,等.基于3D和Virtools技術的虛擬實驗開發(fā)方法研究[J].計算機工程與應用,2006,42(31):84-87.
[3] 梁冠輝,朱元昌,邸彥強.基于HLA/Virtools的高炮火控系統(tǒng)仿真平臺設計[J].系統(tǒng)仿真學報,2009,21(21):6954-6958.
[4] 蓋龍濤,陳月華.基于Virtools的交互式操作模型系統(tǒng)的設計與實現(xiàn)[J].計算機應用,2009,29(S2):308-310,313.
[5] 任偉建,黃晶,王瓊,等.Virtools與數(shù)據(jù)庫整合技術的研究與實現(xiàn)[J].儀器儀表學報,2009,30(6):865-867.
[6] 李梅,韓秀玲,陳光.基于Virtools SDK的虛擬實驗室BB模塊開發(fā)方法研究[J].計算機與現(xiàn)代化,2013(1):67-70.
[7] 覃伯明.Virtools引擎3D游戲程序設計[M].北京:清華大學出版社,2013.
[8] Virtools.Virtools SDK Documentation[S].FRANCE:VIRTOOLS,2006.
[9] 黃藝,王力.基于多數(shù)據(jù)源的OLE DB[J].計算機技術與發(fā)展,2006,16(6):233-235.
[10] 孟培超,胡圣波,舒恒.基于ADO數(shù)據(jù)庫連接池優(yōu)化策略[J].計算機工程與設計,2013,34(5):1706-1710,1715.
[11] John J Patrick.SQL編程基礎[M].劉紅偉,董民輝,譯.3版.北京:機械工業(yè)出版社,2009.
收稿日期:2014-10-02。國家自然科學基金項目(61170025);國家級大學生創(chuàng)新創(chuàng)業(yè)訓練計劃項目(201310500004)。李瑞,本科,主研領域:虛擬現(xiàn)實技術。徐承志,講師。
中圖分類號TP311
文獻標識碼A
DOI:10.3969/j.issn.1000-386x.2016.07.012
DATABASE PLUG-IN DEVELOPMENT AND APPLICATION BASED ON VIRTOOLS PLATFORM
Li RuiXu Chengzhi
(SchoolofComputerScience,HubeiUniversityofTechnology,Wuhan430068,Hubei,China)
AbstractOn Virtools platform, traditional database solution has the problems of complex in Virtools Server configuration, inconvenient in development and difficult in maintenance. In order to solve these problems, we proposed a database plug-ins development scheme which is based on the combination of Virtools SDK and ADO. The database plug-ins developed based on this scheme have strong reusability and possess the flexible databases connection means and the complete access mechanism. It is proved by the practice that the scheme extends the function of Virtools in accessing databases. Compared with Virtools Server built-in by Virtools, this new scheme has higher access efficiency and more compact access process, these make the database-correlated development project more convenient.
KeywordsVirtools ServerVirtools SDKADO