李 瑞 徐承志
(湖北工業大學計算機學院 湖北 武漢 430068)
?
一種基于Virtools平臺的數據庫插件開發與應用
李瑞徐承志
(湖北工業大學計算機學院湖北 武漢 430068)
摘要針對Virtools平臺中傳統數據庫解決方案存在的配置Virtools Server復雜、開發不便、維護困難等問題,提出一種基于Virtools SDK和ADO技術相結合的數據庫插件開發方案。基于該方案開發的數據庫插件具有較強的可重用性,具備靈活的數據庫連接方式和完備的訪問機制。實踐證明,該方案擴展了Virtools訪問數據庫的功能,對比Virtools自帶的Virtools Server,具有更高的訪問效率、更簡潔的訪問流程,使得數據庫相關的開發工作更加便利。
關鍵詞Virtools ServerVirtools SDKADO
0引言
Virtools是一款應用廣泛的3D環境與事件交互的開發軟件,Virtools平臺包括一個腳本編輯器、一個行為引擎、一個渲染引擎、一個Web播放器和一組軟件開發包(SDK)[1,2]。Behavior Building Block(BB)是用來執行特定動作的可視化功能模塊,開發人員透過可視化的開發界面,以類似流程圖的方式拖放行為模塊BB到需要的對象上,最終可建構起豐富的交互式應用程序[3,4]。然而正是由于該軟件在多領域的適用性,造成該軟件在某些功能設計上無法精細,比如:Virtools自帶的操作數據庫BB就需要用戶具有較高的專業背景,和較高的操作技巧,導致用戶使用起來不太方便。這時可以通過Virtools SDK 開發出輕量級的BB模塊來完成相同的工作。
本文作者參與國家級大學生創新創業項目—“基于虛擬校園的軟件生態系統研究”,由于該項目中包含大量的建筑物、用戶、相關活動等數據信息,處理數據的操作也相對復雜,因此根據項目需要,作者自主開發了輕量級的數據庫BB插件。
1Virtools自帶BB的缺陷
利用Virtools平臺自帶的數據庫BB訪問數據庫時,要安裝自帶的服務器組件Virtools Server:這是架構在TCP/IP協議上的C/S系統,專門針對Virtools軟件在網絡層上的應用[5]。訪問數據庫的步驟:
① 配置Virtools Server。
② 將ODBC數據源綁定到Virtools Server端。
③ 通過“Connect to Server” BB連接Virtools Server;并用“getfromDatabase”, “ExecuteSQL Statement”等數據庫BB執行相關操作。
Virtools Server工作的主要目的是給Virtools的開發者提供一個能夠與網絡上的其他用戶或是服務器溝通的界面,所有的資料交換動作都必須通過Virtools Server來進行。基于Virtools和Virtools Server的系統對于普通用戶來說,安裝過程十分繁瑣,需要先進行Virtools Server的安裝、配置和啟動,系統才能訪問數據庫。這不僅會加重系統開發人員的負擔,降低人機的友好程度,使得系統的靈活性受到了一定的限制。為了解決這一問題,可以利用Virtools SDK進行自主BB插件開發。
2Virtools SDK及BB插件開發概述
2.1Virtools SDK
Virtools SDK處于Virtools的最底層,提供了Virtools軟件所有的底層函數,通過SDK開發BB插件(Behavior Plug-in),可以很容易地訪問Virtools API,并可直接使用這些功能函數編寫相關組件,同時還可以擴展Virtools引擎[6]。其插件開發架構圖如圖 1所示。其中,Virtools SDK關鍵部分是行為庫(CK2)和數學庫(VxMath)。數學庫提供底層的函數;行為庫提供 SDK 開發時的基本規范,并且負責組織和管理其他引擎模塊[7]。

圖1 插件開發架構圖
2.2BB插件的開發過程
BB插件的開發過程一共分3個步驟:
① 配置開發環境。Virtools SDK的版本對編譯環境有不同的要求,首先選擇相應的VS版本,然后導入Virtools SDK頭文件和類庫即可。
② BB的功能實現。通過向導生成BB代碼框架,然后根據實際業務需求在其中插入邏輯代碼。
③ 編譯生成BB。編寫、調試完畢,生成Behavior Plug-in(.dll文件),將其拷貝到項目工程中的Building Blocks目錄中即可使用[8]。
下面介紹BB插件的具體設計思路和實現細節。
3輕量級數據庫插件開發
3.1ADO技術
為了避免使用Virtools Server而產生的繁瑣過程,并使訪問數據庫的操作更加簡單靈活,可以采用封裝了ADO技術的BB來訪問數據庫。
ADO是為Microsoft最新和最強大的數據訪問接口OLE DB[9]而設計的,是一個便于使用的應用程序層。OLE DB為任何數據源都提供了高性能的訪問,但使用時候需要添加很多代碼,使用復雜。ADO 是高層數據庫訪問技術,相對于ODBC來說,具有速度快、面向對象的特點[10]。
3.2數據庫插件框架設計
數據庫插件的框架共有三個模塊:Connection模塊(取得數據庫連接),Operation模塊(操作數據庫),Disconnection模塊(斷開數據庫連接)。這三個模塊的關系框架如圖 2所示。

圖2 數據庫插件框架圖
為了提高訪問數據庫BB模塊操作的效率,需要這三個模塊可以共享_ConnectionPtr這個連接數據庫對象,而不必在每個BB中都要進行一次數據源的連接。但是Virtools SDK只有類似String、Int、Float等基本類型的參數,并沒有_ConnectionPtr這個智能指針類型,因此用普通的參數輸出方法就無法達到這種效果。為了解決這個問題,可以將_ConnectionPtr對象存入線性容器——“連接池”。
連接池的數據結構如下:
typedef struct
{_ConnectionPtr m_pConnection;
//智能指針對象
bool IsConnected;
//標記數據源是否連接
}ConnectionPool;
ConnectionPool ConP[MAX];
//存放連接對象的一維數組
然后在每個BB工程文件中用共享變量的方式來申明這個連接池對象(使用external關鍵字),這樣就可以實現_ConnectionPtr智能指針在多個BB之間的共享,而且可以同時連接多個數據源。該連接池的效果如圖3所示。

圖3 _ConnectionPtr對象連接池
3.3插件的實現
(1) Connection模塊
Connection BB的功能是建立數據源的連接。其設計如圖4所示,其參數說明如表1所示。

圖4 Connection BB

參數類型參數名稱數據類型參數作用InstrConString連接數據源的字符串InUIDString用戶名InPWDString密碼OutInfoString連接操作反饋后的結果OutIndexint生成對應數據源的索引
實現步驟如下:
① 從輸入端(In)獲得數據源的連接字符串(strCon),用戶名(UID),密碼(PWD)這三個參數。
② 從連接池中取出一個斷開狀態的_ConnectionPtr對象,調用Open()方法,并利用第一步中的三個參數建立目標數據源的連接。
③ 如果連接成功,則返回該數據源的索引,設置輸出參數(Out)的反饋信息為”Success”,并觸發”Success”出口;否則設置輸出參數(Out)的反饋信息為”Failed”,并觸發”Failed”出口。
(2) Operation模塊
Operation模塊共包含兩個BB:ExecuteSQL BB和SelectSQL BB。ExecuteSQL BB執行的是DDL(數據定義語言)和DML(數據操作語言),其中DDL包括CREATE DATABASE、CREATE TABLE、ALTER TABLE等操作,DML包括UPDATE、INSERT、DELETE等操作;SelectSQL BB執行的是DQL(數據查詢語言),包括SELECT等操作[11]。
ExecuteSQL BB的設計如圖 5(a)所示,其參數說明如表2所示。

圖5 Operation模塊

參數類型參數名稱數據類型參數作用InIndexint目標數據源的索引InDDL/DMLString執行的SQL語句OutInfoString執行操作反饋的結果
實現步驟如下:
① 從輸入端(In)獲得要訪問數據源的索引(Index)和待執行的SQL語句(DDL/DML)。
② 利用索引在連接池中獲得與目標數據源的連接對象(_ConnectionPtr),調用此對象的Execute方法執行SQL。
③ 如果執行成功,設置輸出參數(Out)的反饋信息”ExecuteSQL success”,并觸發”Success”出口;否則,設置輸出參數(Out)的反饋信息”ExecuteSQL Failed”,并觸發”Failed”出口。
SelectSQL BB的設計如圖 5(b)所示,其參數說明如表3所示。表中,DataArray是個類似數據庫中表的數據結構,列定義了數據類型,行包含對應數據類型的值。

表3 SelectSQL BB參數說明
(3) Disconnection模塊
Disconnection BB的功能是斷開數據源連接,避免資源浪費。其設計如圖6所示,其參數說明如表4所示。

圖6 Disconnection BB

參數類型參數名稱數據類型參數作用InIndexint目標數據源的索引OutInfoString執行操作反饋的結果
實現步驟如下:
① 從輸入端(In)獲得要斷開數據源的索引(Index)。
② 利用索引在連接池中獲得目標數據源的連接對象(_ConnectionPtr),調用此對象的Close()方法。
③ 如果執行成功,設置輸出參數(Out)的反饋信息”This datasourse has already disconnected”,并觸發”Success”出口;否則,設置輸出參數(Out)的反饋信息”Unknown Error”,觸發”Failed”出口。
4實現效果及對比分析
4.1插件應用
圖7所示為“基于虛擬校園的軟件生態系統研究”項目中加載數據庫中建筑物信息到Array中的腳本程序。設置數據源的連接字符串為“Provider = Microsoft.Jet.OLEDB.4.0;Data Source = VirtualSchool.mdb”; 因為Access數據庫沒有用戶名和密碼,所以UID和PWD都設置為空。這樣就可以取得VirtualSchool.mdb數據源連接,同時Connection BB就將得到的數據源索引傳入到SelectSQL BB的Index輸入參數,將SQL語句設為“select * from BuildingInfo”,就可以得到BuildingInfo表中所有的內容,并將其保存到TargetArray中,圖8所示為TargetArray中的數據。

圖7 加載數據庫信息腳本程序

圖8 TargetArray中保存BuildingInfo表中數據
4.2對比分析
下面進行改進前后訪問數據庫操作優劣的綜合分析:
(1) 數據庫加載方式的比較
① Virtools Server:Virtools自帶的建立數據源連接模塊需要配置Virtools Server和綁定ODBC(如圖9、圖10所示),同時在Virtools中建立與數據庫表中字段一一對應的數組Array,最后通過”Connect to Server” BB(指定連接數據庫的參數)加載數據源。

圖9 配置virtools Server界面

圖10 綁定數據源界面
② 自帶插件:改進后只需將.dll文件拷貝到插件目錄下即可使用,在”Connection” BB中設置對應連接數據源字符串。
Virtools Server是獨立的中間件,購買費用十分昂貴,同時Virtools Server安裝配置過程十分繁瑣。由此可見改進后的數據庫插件技術更加簡易、靈活。
(2) 數據源選擇的比較
① Virtools Server:只支持ODBC訪問接口,此數據源需要用戶手動配置。
② 自帶插件:結合Virtools SDK在BB插件中封裝ADO的訪問數據庫技術支持可以多種數據源訪問接口。
ODBC訪問接口的可擴展性差,而且只支持關系型數據庫;而由于ADO訪問接口的可擴展性強,能統一訪問關系和非關系型數據庫,使得改進后BB能夠讀取更多種類的數據源。
(3) 數據操作的比較
① Virtools Server:自帶的”Execute SQL Statement” BB不能執行DDL等SQL語句。
② 自帶插件:改進后的操作數據模塊可以執行所有的SQL語句。
自主開發的操作數據庫插件擴展性強,功能完整,降低了數據庫系統和Virtools應用的耦合度。
(4) 數據源管理的比較
① Virtools Server:在Virtools Server中能夠設置并顯示允許連接Server最大的數量,響應的最長時間,甚至是某段范圍內IP的訪問權限。
② 自帶插件:改進后的插件技術缺少對數據源管理的功能。
利用Virtools Server訪問數據庫方便數據源的管理與監控,安全性較高。
表5所示為兩種訪問數據庫的4個方面的比較。Virtools Server主要用于網絡層的數據訪問,功能雖然強大,但繁瑣受限。由此可以看出,自主開發的插件對于輕量級的應用是十分方便可行的。

表5 兩種訪問數據庫方式的比較
5結語
該項方案利用Virtools SDK和ADO技術開發了更加方便的訪問數據庫BB插件。該插件在訪問數據庫時避開了Virtools Server的配置,使得代碼實現更加簡易;同時還擴展了數據庫連接方式,增加了對數據定義語言(DDL)的支持,使得開發操作更加靈活方便。有別于其他解決方案,該方案成功引入_ConnectionPtr對象連接池的概念,使得自主開發的數據庫BB可以共享數據源的連接,提高了BB的利用率,減輕了系統的負擔,特別在多數據源的情況下,優勢更為明顯。然而,該方案依然存在改進的空間,即以共享變量來實現不同BB間的數據共享會破壞對象的封裝性,不利于對象的管理。在今后的工作中,怎么更好地實現復雜數據類型在Virtools的共享仍然值得探索。
參考文獻
[1] 方利偉.基于Virtools的三維虛擬實驗室研究與實現[J].實驗技術與管理,2010,27(5):83-86.
[2] 李昌國,朱福全,譚良,等.基于3D和Virtools技術的虛擬實驗開發方法研究[J].計算機工程與應用,2006,42(31):84-87.
[3] 梁冠輝,朱元昌,邸彥強.基于HLA/Virtools的高炮火控系統仿真平臺設計[J].系統仿真學報,2009,21(21):6954-6958.
[4] 蓋龍濤,陳月華.基于Virtools的交互式操作模型系統的設計與實現[J].計算機應用,2009,29(S2):308-310,313.
[5] 任偉建,黃晶,王瓊,等.Virtools與數據庫整合技術的研究與實現[J].儀器儀表學報,2009,30(6):865-867.
[6] 李梅,韓秀玲,陳光.基于Virtools SDK的虛擬實驗室BB模塊開發方法研究[J].計算機與現代化,2013(1):67-70.
[7] 覃伯明.Virtools引擎3D游戲程序設計[M].北京:清華大學出版社,2013.
[8] Virtools.Virtools SDK Documentation[S].FRANCE:VIRTOOLS,2006.
[9] 黃藝,王力.基于多數據源的OLE DB[J].計算機技術與發展,2006,16(6):233-235.
[10] 孟培超,胡圣波,舒恒.基于ADO數據庫連接池優化策略[J].計算機工程與設計,2013,34(5):1706-1710,1715.
[11] John J Patrick.SQL編程基礎[M].劉紅偉,董民輝,譯.3版.北京:機械工業出版社,2009.
收稿日期:2014-10-02。國家自然科學基金項目(61170025);國家級大學生創新創業訓練計劃項目(201310500004)。李瑞,本科,主研領域:虛擬現實技術。徐承志,講師。
中圖分類號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