李培軍,畢于慧,田仲,張權,董瑋
(61139部隊信息中心,北京 100091)
摘要: 利用國產數據庫(達夢和神通)與Oracle數據庫訪問接口OCI的兼容性,設計了OCI訪問接口封裝類,以VC++為平臺實現了應用程序由Oracle向國產數據庫的移植。對移植后的查詢性能進行了比較,結果表明,國產數據庫的數據查詢性能優于Oracle,作為國家自主知識產權,國產數據庫在安全性和后續服務上比Oracle更有優勢,對于建立我國自主可控的信息產業體系有一定借鑒意義。
關鍵詞:OCI封裝;國產數據庫;移植
0引言
為提高信息安全,發展自主可控信息系統是我國信息化建設中的重要任務,采用國產數據庫構建應用系統正成為趨勢。目前,很多政府部門和企業都在嘗試將應用遷移到國產數據庫上。本文針對基于Oracle數據庫的應用程序,利用國產數據庫與Oracle數據庫訪問接口OCI的兼容性,研究了如何利用OCI進行面向對象的封裝,構建通用的數據庫訪問類,為用戶提供統一的數據庫訪問接口,使程序員更方便地實現數據應用由Oracle數據庫向國產數據庫的移植。
1OCI簡介
OCI(Oracle Call Interface)是Oracle公司開發的一個應用程序開發工具。它提供了一組可對Oracle數據庫進行存取的接口子例程,通過在第三代語言中進行調用可達到存取Oracle數據庫的目的[1]。作為一種數據庫訪問方法,它比ODBC、ADO等訪問接口更為靈活,訪問和執行速度也更快。
2OCI封裝類的設計與實現
2.1OCI類的設計
進行OCI封裝類時的設計思想如下[23]:
(1)對外隱藏復雜的OCI函數調用,只提供鏈接、查詢、斷開等直觀的數據庫訪問方法。
(2)使用OCI調用會涉及許多句柄,把各類句柄作為類成員進行管理。
(3)提供統一友好的接口供應用程序調用。
2.2OCI類的實現
使用OCI方法實現Oracle數據庫應用鏈接流程如圖1所示,本文將其過程進行封裝,將OCI底層函數封裝到一個類里,該類包含3個函數:Connect()、Query()和DisConnect(),其中,Connect()實現數據庫的鏈接,Query()函數實現數據的查詢。針對大字段,可構建專門的查詢語句QueryBLOB()。
(1)Connect()函數
Connect()函數主要包括OCI環境初始化、錯誤檢查、分配事務句柄等。
OCIEnvInit(&envhp,(ub4)OCI_DEFAULT,(size_t)0,(dvoid**)0);
OCIHandleAlloc((dvoid*)envhp,(dvoid**)&errhp,(ub4)OCI_HTYPE_ERROR,(size_t)0,(dvoid**)0);
OCIAttrSet( (dvoid*)svchp,(ub4)OCI_HTYPE_SVCCTX,(dvoid*)srvhp,(ub4)0,(ub4)OCI_ATTR_SERVER,errhp);圖1OCI的流程和對應封裝函數status = OCISessionBegin(svchp,errhp,usrhp,OCI_CRED_RDBMS,OCI_DEFAULT);
OCIAttrSet((dvoid*)svchp,(ub4)OCI_HTYPE_SVCCTX,(dvoid*)usrhp,(ub4)0,(ub4)OCI_ATTR_SESSION,errhp);
OCIHandleAlloc( (dvoid *)envhp,(dvoid **)&txnhp,OCI_HTYPE_TRANS,0,0);
(2)Query()函數
open();
prepare(query);
allocateCursor();
(3)DisConnect()函數
該函數包括結束會話、釋放句柄和相應資源。
OCISessionEnd( svchp,errhp,usrhp,(ub4)OCI_DEFAULT );
OCIServerDetach(srvhp,errhp,(ub4)OCI_DEFAULT);
OCIHandleFree((dvoid*)txnhp,(ub4)OCI_HTYPE_TRANS);
3使用OCI封裝類進行數據應用的移植
3.1移植過程
本文將上述的OCI封裝類用于實現基于Oracle數據庫的應用向國產數據庫移植。Oracle數據庫版本9.0以上,國產數據庫采用達夢7.1.3.165、神通數據庫7.0,達夢數據庫和神通數據庫分別提供了DM DCI和CNIL數據庫訪問接口[4-5],這兩個接口都與Oracle OCI接口兼容,所以在數據應用移植的過程中只需要將Oracle的oci.h、oci.lib替換為達夢的oci.h、 dmoci.lib或者神通的cnil.h、cnil.lib,同時將達夢或者神通安裝目錄下的include目錄包含即可編譯成功,無需修改代碼。表1中描述了不同數據庫在移植過程中所必需的文件。
數據應用移植過程如圖2所示。采用遷移工具將數據從Oracle數據庫遷移到國產數據庫中,國產數據庫都提供了數據遷移工具,并支持多數據源;各類型數據庫通過不同的數據庫頭文件來實現底層函數的調用[67];SQL配置工具主要方便用戶在調整庫結構或優化查詢時修改SQL語句。
通過圖2可以看出,將應用程序從Oracle數據庫移植到國產數據時,通過一個集中的OCI面向對象封裝類可實現不同類數據庫管理系統訪問接口,只需將對應的庫文件和頭文件進行替換并重新編譯程序即可完成,同時要將對應的動態庫與應用程序放在一起。
3.2應用效果
本文采用Visual C++ 6.0為開發平臺進行應用開發,對某單位的業務應用系統進行國產化移植,并分別在本地和通過網絡(百兆)客戶端,使用業務程序查詢業務庫中某一張表(21個字段,76 470條記錄),并對查詢結果進行比較,各類數據庫的查詢速度如表2所示。
從查詢速度上看,神通數據庫優勢較為明顯;從網絡配置上,達夢和神通數據庫無需安裝數據庫客戶端,應用程序可直接訪問網絡數據庫(只需提供數據庫名和IP地址即可),較之于Oracle開發的應用,部署和升級更加方便。
4結論
Oracle OCI一種相對高效的底層訪問方式,國產主流數據庫都針對OCI開發了基于數據庫底層的且兼容Oracle的訪問接口(如達夢的DCI和神通的CNIL),本文采用VC++構建了適應不同訪問接口的OCI封裝類[8-9],并成功應用于某單位基于數據庫的應用程序國產化改造,提高了從基于Oracle的OCI向國產數據庫的應用移植效率。另外,國產數據庫在安全性和后續服務上比Oracle更有優勢,是未來的發展趨勢。
參考文獻
[1] 何雄.Oracle Spatial與OCI高級編程[M].北京:中國鐵道出版社,2006.
[2] 莫晶,胡術,李娜娜,等.基于OCI的數據庫訪問接口的改進與實現[J].福建電腦,2009,25(1):12.
[3] 龐維翰,陳有青.用OCI封裝類進行數據庫間應用系統的移植[J].計算機工程與應用,2005,41(29):177179.
[4] 達夢數據庫(武漢)有限公司.達夢程序員手冊[Z].2014.
[5] 天津神舟通用數據技術有限公司.神通程序員手冊[Z].2010.
[6] POLI F, OVEREEM S, LAMMERS G J, et al. Narcolepsy as an adverse event following immunization: case definition and guidelines for data collection, analysis and presentation[J]. Vaccine, 2013, 31(6): 9941007.
[7] POLI F, OVEREEM S, LAMMERS G J, et al. Narcolepsy as an adverse event following immunization: case definition and guidelines for data collection, analysis and presentation[J]. Vaccine, 2013, 31(6): 9941007.
[8] 蔣楠,于紅業,葛利俊,等.Oracle內嵌表及應用[J].微型機與應用,2014,33(3):9192.
[9] 陳旭飛,于鳳芹,欽道理,等.異構數據庫系統數據轉換方法設計與實現[J].微型機與應用,2015,34(8):9496,100.