现在的位置: 首页 > 综合 > 正文

C++合并OCI/OCCI 比 C++合并ADO 快十倍

2013年03月13日 ⁄ 综合 ⁄ 共 2564字 ⁄ 字号 评论关闭

 

 

引言

  Oracle以其优越的稳定性和卓越的性能在众多领域里有着广泛的应用,其高性能是Oracle优于其他数据库的关键因素。然而影响终端应用程序的性能不只是Oracle服务程序及硬件环境,应用程序的开发语言和开发方式也有着重要的影响。

  目前,可以在多种开发语言中开发Oracle应用程序,比如可以在VBDelphi等高级开发语言中开发,可以以C++开发,也可以以Java语言开发,甚至可以通过ASPJSPPerl等脚本语言来访问Oracle。这些语言环境各有其优势,C++无疑是追求极致速度的首选。

  在C++中我们也可以有多种接口方式,可以使用ADO通用接口,可以使用OCI/OCCI,还可以使用ODBCOO4OOLEDB等方式。在这些方式中,ADOOCI是应用最为广泛的两种方式,本文将集中力量介绍在Visual C++ 6.0 中这两种接口的开发方法及它们的特点对比。

   ADO开发接口简介

  ADO(ActiveX Data ObjectsActiveX数据对象)Microsoft为强大的数据访问接口 OLEDB(对象链接和嵌入数据库)而设计的,是一个便于使用的应用层的编程接口。使用 ADO编写的应用程序可以通过OLEDB提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、可以访问多种数据库及可以在多种语言中开发。

  由于ADO建立在自动化(Automation)的基础上,所以ADO的应用场合非常广泛,不仅可在Visual Basic这样的高级语言开发环境中使用,还可以在一些脚本语言中使用,这对于开发Web应用和在ASP(Active Server Page,动态服务器主页)的脚本代码中访问数据库提供了操作应用的捷径。

  ADO访问数据库的模型示意参见图1


1  ADO模型示意图

  从上图可以看出ADO是以OLE DB为基础,它对OLE DB进行了封装,所以ADO其实是OLE DB的应用层接口,是介于OLE DB与应用程序之间的中间层。这种结构为一致的数据访问接口提供了很好的扩展性,不再局限于特定的数据源,只要OLE DB支持的数据源,ADO都可以很好地支持。

         ADO的另一个特性是使用简单,它封装了OLE DB的复杂的接口,以ConnectionRecordsetCommand三个主体对象及ErrorsPropertiesParametersFields四个集合对象搭建起了ADO对象模型,见下图:


2 ADO对象模型

  通过这七个对象及它们的方法,我们就可以完成绝大多数的访问数据库的任务,来实现我们的应用目标。

   OCI开发接口简介

  OCI(Oracle Call Interface)Oracle 数据库调用接口,是由Oracle提供的用于开发前端应用程序及中间件的C/C++开发类库。通过OCI,可以控制所有类型的SQL语句的执行,包括DDL、控制语句(事务、会话、系统)、查询、DMLPL/SQL,以及嵌入式SQLOCI能够最大程度地控制程序的运行,执行Oracle服务器所允许的多有数据库操作,可以访问Oracle数据库服务器里的所有数据类型,包括标量值、集合和所有对象类型的实例,可以以引用的方式访问对象及其元数据,可以动态获取、修改对象的属性值。

  OCI程序既具有SQL非过程性的优点,也具有第三代程序设计语言的过程性和灵活性,使开发的编程技术具有更强的数据处理能力。

  同时,OCI在所有运行Oracle的平台上具有良好的可移植性,程序无须太大修改即可运行在Unix/Linux/Windows甚至嵌入式环境下。

  OCI还是其他Oracle开发接口的底层实现,如ADOJDBC都是在OCI上层的封装,由于OCI是比较底层的接口,少了很多层的封装,可以提供应用程序与Oracle的直接连接,所以OCI可以提供最佳的性能。正是基于此,Oracle自身的一些工具及许多著名的Oracle 数据库工具也都是用OCI开发的,如大名鼎鼎的Toad。笔者的OraExplorer也是基于OCI接口开发。

  但由于C/C++的学习难度比较大,所以OCI的开发难度与ADOJDBC等开发接口相比要大许多,OCI的每一个函数的参数都非常多,且比较难以理解,而国内关于OCI开发的学习资料非常少,所以使用OCI开发应用程序的程序员相对ADO的程序员要少得多。

   对比实验设计

  本文将通过一个具体的实验来对比ADOOCI的性能差距,数据库访问接口的性能主要体现在两个方面,一个是数据读取速度,另一个是数据写入速度,所以本文将基于ADOOCI各自开发一个Visual C++ 6.0应用程序来进行这两个方面的实验,每个程序完成功能如下:

  1) 建立连接

  首先,需要连接到Oracle服务器,在这一步需要用户提供SID、用户名和密码信息。

        2) 数据初始化

  为了实验的通用性及方便读者重现,本实验直接在System用户下操作,需要一个记录数比较多的表来,首先对all_objects表镜像,生成my_objects表,然后对My_objects表自身进行五次递归镜像,最生成一个百万记录的表。相关SQL语句如下:

  Truncate table my_objects;
  Drop table my_objects;
  create table my_objects as select * from all_objects;
  insert into my_objects select * from my_objects;
  insert into my_objects select * from my_objects;
  insert into my_objects select * from my_objects;
  insert into my_objects select * from my_objects;
  insert into my_objects select * from my_objects;

  3) 数据读取

  遍历数据表,读取Object_name字段的值,并记录花费的时间。

  4) 数据写入

  --创建新表
  

抱歉!评论已关闭.