2006两种Oracle应用程序开发接口的对比分析
更新时间:2023-04-10 17:05:01 阅读量: 实用文档 文档下载
- oracle应用程序图标推荐度:
- 相关推荐
2006-2007年
中国IT应用技术蓝皮书
IT168
2007年1月
两种Oracle应用程序开发接口的对比分析
ITPUB技术专家李绍俊
摘要:本文将介绍在Visual C++ 6.0中开发Oracle应用程序的最常用的两种方式:ADO(ActiveX Data Objects, ActiveX 数据对象)与OCI(Oracle Call Interface, Oracle调用接口)。通过设计实验,采用两种方式分别完成数据初始化、数据读取、数据更新等工作,通过对比两种方式的代码量及运行速度来分析两种方式的特点,并最终总结出两种方式各自的优缺点与适用范围。
关键词:ADO, OCI, Oracle开发,Visual C++开发
引言
Oracle以其优越的稳定性和卓越的性能在众多领域里有着广泛的应用,其高性能是Oracle优于其他数据库的关键因素。然而影响终端应用程序的性能不只是Oracle服务程序及硬件环境,应用程序的开发语言和开发方式也有着重要的影响。
目前,可以在多种开发语言中开发Oracle应用程序,比如可以在VB、Delphi等高级开发语言中开发,可以以C++开发,也可以以Java语言开发,甚至可以通过ASP、JSP、Perl等脚本语言来访问Oracle。这些语言环境各有其优势,C++无疑是追求极致速度的首选。
在C++中我们也可以有多种接口方式,可以使用ADO通用接口,可以使用OCI/OCCI,还可以使用ODBC、OO4O及OLEDB等方式。在这些方式中,ADO与OCI是应用最为广泛的两种方式,本文将集中力量介绍在Visual C++ 6.0 中这两种接口的开发方法及它们的特点对比。
1. ADO开发接口简介
ADO(ActiveX Data Objects,ActiveX数据对象)是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的复杂的接口,以Connection、Recordset、Command三个主体对象及Errors、Properties、Parameters和Fields四个集合对象搭建起了ADO对象模型,见下图:
图2ADO对象模型
通过这七个对象及它们的方法,我们就可以完成绝大多数的访问数据库的任务,来实现我们的应用目标。
2. OCI开发接口简介
OCI(Oracle Call Interface)是Oracle 数据库调用接口,是由Oracle提供的用于开发前端应用程序及中间件的C/C++开发类库。通过OCI,可以控制所有类型的SQL语句的执行,包括DDL、控制语句(事务、会话、系统)、查询、DML、PL/SQL,以及嵌入式SQL。OCI 能够最大程度地控制程序的运行,执行Oracle服务器所允许的多有数据库操作,可以访问Oracle数据库服务器里的所有数据类型,包括标量值、集合和所有对象类型的实例,可以以引用的方式访问对象及其元数据,可以动态获取、修改对象的属性值。
OCI程序既具有SQL非过程性的优点,也具有第三代程序设计语言的过程性和灵活性,使开发的编程技术具有更强的数据处理能力。
同时,OCI在所有运行Oracle的平台上具有良好的可移植性,程序无须太大修改即可运行在Unix/Linux/Windows甚至嵌入式环境下。
OCI还是其他Oracle开发接口的底层实现,如ADO、JDBC都是在OCI上层的封装,由于OCI是比较底层的接口,少了很多层的封装,可以提供应用程序与Oracle的直接连接,所以OCI可以提供最佳的性能。正是基于此,Oracle自身的一些工具及许多著名的Oracle 数据库工具也都是用OCI开发的,如大名鼎鼎的Toad。笔者的OraExplorer也是基于OCI 接口开发。
但由于C/C++的学习难度比较大,所以OCI的开发难度与ADO、JDBC等开发接口相比要大许多,OCI的每一个函数的参数都非常多,且比较难以理解,而国内关于OCI开发的学习资料非常少,所以使用OCI开发应用程序的程序员相对ADO的程序员要少得多。
3. 对比实验设计
本文将通过一个具体的实验来对比ADO与OCI的性能差距,数据库访问接口的性能主要体现在两个方面,一个是数据读取速度,另一个是数据写入速度,所以本文将基于ADO 和OCI各自开发一个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、数据写入
--创建新表
truncate table my_objects2;
drop table my_objects2;
create table my_objects2 (
owner varchar2(30),
object_name varchar2(30),
subobject_name varchar2(30),
object_id int,
data_object_id int);
向表中写入10万条记录,并记录花费的时间。
5、清空环境
释放内存,断开连接。
4. ADO程序关键代码
首先需要在stdafx.h中添加如下代码
//消除一些无用的警告
#pragma warning(disable:4146 4244)
//导入ADO应用库,并对命名空间及EOF重命名
#import "C:\Program Files\Common Files\System\ADO\msado15.dll"\ rename_namespace("MYADO") rename("EOF", "EndOfFile")
下面的是关键实现代码:
//初始化连接对象
h r = m_pConnection.CreateInstance(__uuidof(MYADO::Connection));
//初始化记录集对象
m_pRs.CreateInstance(__uuidof(MYADO::Recordset));
//设置连接参数
C String strConnection;
s trConnection.Format(_T("Provider=OraOLEDB.Oracle.1;"
"Password=%s;"
"User ID=%s;"
"Data Source=%s"),
strPwd, strUser, strSID);
//连接到数据库
m_pConnection->Open((_bstr_t)strConnection,_T(""),_T(""),-1);
//执行SQL语句
s trSQL.Format("Truncate table my_objects");
m_pConnection->Execute(_bstr_t(strSQL),NULL,MYADO::adCmdText);
//打开记录集
s trSQL.Format("Select object_name from my_objects");
m_pRs->Open((_bstr_t)strSQL,
m_pConnection.GetInterfacePtr(),
MYADO::adOpenForwardOnly,
MYADO::adLockReadOnly,
MYADO::adCmdText);
//遍历并读取数据
w hile(!m_pRs->EndOfFile)
{
varValue = m_pRs->Fields->GetItem(long(0))->GetValue();
m_pRs->MoveNext();
}
strSQL.Format("Insert into my_objects2 values
('TestTest','TestTest','TestTest',0,0)");
//写入数据
for(int i=0;i<100000;i++)
{
m_pConnection->Execute(
_bstr_t(strSQL),NULL,MYADO::adCmdText);
}
//关闭连接
m_pConnection->Close();
OCI的关键代码限于篇幅,不予罗列。
本实验的ADO应用程序的源代码、可执行程序以及OCI的可执行程序可以到19c55447be1e650e52ea99cb下载,OCI的源代码因涉及技术保密问题,无法公开,敬请谅解。
5.实验结果
为了消除网络影响,Oracle服务器和应用程序在同一台笔记本上运行。
硬件环境
CPU:Intel 双核2.0G
硬盘:7200转100G
内存:1G
软件环境
操作系统:winXP SP2
数据库:Oracle 9.2.0.1.0
统计结果中的代码行数为除去界面通用代码后的有效代码行数。
表1 ADO与OCI对比分析
6.ADO与OCI对比分析
1.功能方面
ADO为了保持其通用性,除了对MS SQLServer支持较好外,没有办法对其他数据库提供很完善的功能,对Oracle同样如此。通过ADO访问Oracle,可以实现比较通用的功能,如DML、DDL、查询、事务控制等,但对于Oracle中的对象、集合、LOB等特殊元素则不能很好地支持,对于PL/SQL的支持也很不完整。而OCI在这方面则有着显著的优势,它可以很完整地支持Oracle的所有功能,可以说是对Oracle功能支持最完整的开发接口。而且OCI可以支持多种操作系统,而ADO则只能在Windows系列操作系统下运行。
但在支持面方面,ADO则有很大优势:一方面,它几乎支持目前所有流行的数据库,如MS SQLServer、Oracle、Sybase、DB II等,写好的访问一种数据库的代码,可以稍做修改就能支持另一种数据库,这是ADO的巨大优势;另一方面,它也几乎支持目前所有的开发环境,不管是采用VC开发还是用VB开发,甚至采用Delphi、ASP等等都可以使用ADO来访问数据库。
2.性能方面
从上面的实验结果可以看出,在性能方面,OCI也有着非常大的优势,读取数据的速度快了4倍多,写入数据的速度快了一百多倍。
由于OCI省掉了应用程序与Oracle服务器之间的中间封装层,可以直接访问数据,另外,OCI是C接口,可以直接操纵内在,所以其访问速度非常快,占用系统资源和网络资源也都要少得多。
在笔者的开发经验中,对于存储在Oracle中的二进制数据(如空间数据、影像数据)及长字符串数据,OCI的性能优势要更加明显.。
3.开发难度方面
在这方面ADO的优势很明显,首先,ADO的学习难度较低,ADO是以面向对象的思想封装的,其对象和方法都易学易用,而且ADO的学习资料很丰富,网上可以找到大量的文档及源代码;而OCI则是过程化封装的开发接口,它的函数虽然不是很多,但函数之间的关系比较复杂,且函数的参数非常多,很多函数都有十几个参数,非常难于理解。另外,国内使用OCI开发的程序员比较少,可用的参考资料也非常少,所以OCI的学习难度很大。
另一方面,OCI开发的程序的代码量要比ADO的多得多,且代码之间的关系比较复杂,不易维护。
为了解决这一方面的问题,笔者基于OCI进行了基于面向对象思想的封装,简化了OCI 的开发模型,并封闭了OCI的异常处理机制,使得OCI的开发难度大大降低,代码量能够接近于ADO的代码量,且更易维护。这一部分的内容不属于本文讨论范围,所以不在此展开论述。
7.总结与结论
ADO与OCI是在VC中开发Oracle应用程序的常用的两种接口,它们各自有着自己的特点,有独特的优势,也都有自己的局限性,在开发过程中我们需要根据具体情况来选择使用哪种开发接口。
如果应用程序需要访问多种数据库,既要访问存储在Oracle中的数据,也要访问存储在MS SQL Server中的数据,那么ADO是最佳选择,它可以使用一套代码实现多种数据库的访问。
如果应用程序只需要访问Oracle数据库,且对性能要求很高,那OCI就是最好的选择了。
参考文献
1 骆昌平. ADO技术及其在VC数据库开发中的应用. 电信交换,2005,1
2 李陇杰数据库开发应用:VC下开发ADO的封闭类软件开发与应用2006.2
3 杨培章,马东祥,陶治宇,陈朝辉OCI接口简介及其在VC++中的应用电脑编程技巧与维护,2003,11
4 曹志聪,姚国祥基于OCI技术的Oracle数据库连接微机发展,2004,8
5 金沂基于Oracle数据库的C程序设计计算机与网络,2006,12
6 郑军,陈正阳利用OCI与OLE开发Oracle空间数据库计算机工程与设计2004.6
7 李乾富,黄书强VC++ 6.0访问Oracle LOB的方法微型机与应用2003.2
8 高博,张亚东常用数据库访问技术的研究河南科技2005.12
9 Oracle文档库Oracle Call Interface Programmer’s Guide Release 2 (9.2), Part Number A96584-01
正在阅读:
2006两种Oracle应用程序开发接口的对比分析04-10
C语言2级习题10-07
中华民族的形成与发展04-23
第五单元写作:论证要合理教学设计01-29
电感磁珠料号编码08-16
10.3平行线的性质随堂测试03-09
中餐烹饪专业论证报告10-14
中国车用电池行业调研分析报告05-20
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 程序开发
- 接口
- 对比
- 应用
- 分析
- Oracle
- 2006
- 2022年河北工程大学理学院828化学综合之物理化学考研核心题库
- 学前教育专业乐理考试试卷
- 学校食品安全及防范措施(2022版)
- 间歇式供暖房间内壁面结露测试与原因分析
- 高职教育教学质量监控与评价体系的研究
- 2022年安徽大学经济学院434国际商务专业基础之国际金
- 中考语文综合性学习专题练习汇编十
- 2022版学校汛期安全教育
- 班主任经验交流:在摸索中积累,在实践中沉淀.doc
- -云计算标准化白皮书-CESI-2012-06
- 学校食堂学生评比细则
- 2013中考数学考前指导
- 部编版小学四年级语文上册期末试卷与答案
- ASTM中英文对照目录大全
- 中班个案观察记录:内向幼儿的进步过程-中班内向孩子个案观察
- 人教版小学一年级语文下册生字表(二)看拼音写词语练习(田字格)_(
- 比亚里茨钟楼图卢兹布拉纳克机场酒店(Campanile Toulouse - Blag
- 气瓶充装安全生产制度(正式)
- 2011年证券市场基础知识PDF版
- 对你生活的城市谈一谈你对该城市的城市管理的思考与建议知识分享