国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

兩種Oracle應用程序開發接口的對比分析

2024-08-29 13:34:00
字體:
來源:轉載
供稿:網友
引言 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 中這兩種接口的開發方法及它們的特點對比。一、ADO開發接口簡介 ADO(ActiveX Data Objects,ActiveX數據對象)是Microsoft為強大的數據訪問接口 OLEDB(對象鏈接和嵌入數據庫)而設計的,是一個便于使用的應用層的編程接口。使用 ADO編寫的應用程序可以通過OLEDB提供者訪問和操作數據庫服務器中的數據。ADO 最主要的優點是易于使用、可以訪問多種數據庫及可以在多種語言中開發。

由于ADO建立在自動化(Automation)的基礎上,所以ADO的應用場合非常廣泛,不僅可在Visual Basic這樣的高級語言開發環境中使用,還可以在一些腳本語言中使用,這對于開發Web應用和在ASP(Active Server Page,動態服務器主頁)的腳本代碼中訪問數據庫提供了操作應用的捷徑。ADO訪問數據庫的模型示意參見圖1。 兩種Oracle應用程序開發接口的對比分析(圖一)圖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對象模型,見下圖: 兩種Oracle應用程序開發接口的對比分析(圖二)圖2:ADO對象模型二、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的程序員要少得多。
三、對比實驗設計 本文將通過一個具體的實驗來對比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的源代碼因涉及技術保密問題,無法公開,敬請諒解。
五、實驗結果為了消除網絡影響,Oracle服務器和應用程序在同一臺筆記本上運行。 硬件環境

CPU:Intel 雙核2.0G

硬盤:7200轉 100G

內存:1G

軟件環境

操作系統:winXP SP2

數據庫:Oracle 9.2.0.1.0 統計結果中的代碼行數為除去界面通用代碼后的有效代碼行數。 兩種Oracle應用程序開發接口的對比分析(圖三)表1六、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的代碼量,且更易維護。這一部分的內容不屬于本文討論范圍,所以不在此展開論述。 七、總結與結論

 

ADO與OCI是在VC中開發Oracle應用程序的常用的兩種接口,它們各自有著自己的特點,有獨特的優勢,也都有自己的局限性,在開發過程中我們需要根據具體情況來選擇使用哪種開發接口。 假如應用程序需要訪問多種數據庫,既要訪問存儲在Oracle中的數據,也要訪問存儲在MS SQL Server中的數據,那么ADO是最佳選擇,它可以使用一套代碼實現多種數據庫的訪問。 假如應用程序只需要訪問Oracle數據庫,且對性能要求很高,那OCI就是最好的選擇了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平乐县| 错那县| 清新县| 香河县| 彩票| 苗栗县| 崇州市| 高淳县| 芦山县| 云梦县| 堆龙德庆县| 沅江市| 白朗县| 且末县| 北海市| 眉山市| 白沙| 霍林郭勒市| 建宁县| 友谊县| 固阳县| 泾阳县| 衡水市| 阳城县| 房山区| 合作市| 宜兰市| 洛阳市| 陇南市| 诸城市| 抚顺市| 重庆市| 武乡县| 麻江县| 青川县| 信丰县| 新丰县| 个旧市| 南陵县| 平阳县| 赞皇县|