三、对比实验设计
本文将通过一个具体的实验来对比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) 清空环境
释放内存,断开连接。
四、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") 下面的是关键实现代码: //初始化连接对象 hr = m_pConnection.CreateInstance(__uuidof(MYADO::Connection)); //初始化记录集对象 m_pRs.CreateInstance(__uuidof(MYADO::Recordset)); //设置连接参数 CString strConnection; strConnection.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语句 strSQL.Format("Truncate table my_objects"); m_pConnection->Execute(_bstr_t(strSQL),NULL,MYADO::adCmdText); //打开记录集 strSQL.Format("Select object_name from my_objects"); m_pRs->Open((_bstr_t)strSQL, m_pConnection.GetInterfacePtr(), MYADO::adOpenForwardOnly, MYADO::adLockReadOnly, MYADO::adCmdText); //遍历并读取数据 while(!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的可执行程序可以到
http://www.snowywolf.net下载,OCI的源代码因涉及技术保密问题,无法公开,敬请谅解。