李培军,毕于慧,田仲,张权,董玮
(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.