ODBC、OLEDB和ADO之間的關系 ,以及性能比較


學習了.net視頻之后,對里面涉及到的數據庫連接部分中的一些概念表示很無語。網上很多相關資料,但除了網站不一樣外,基本上內容都神一樣的一致。

       現在,我就通過結合看到的一些資料再加上自己的理解試圖去解釋一下,有不對的,還請大家指教!

看一張圖:

看圖中右半部分,我們先來了解一下ODBC這個概念。

1.ODBC:

           要了解ODBC是什么,先了解一下數據庫連接的相關知識。其實,在最開始連接數據庫時,由於數據庫種類繁多,各種數據庫連接有不同的需求,這個時期,數據庫連接主要依靠各種API函數來進行連接。而ODBC就是將這些API函數封裝起來形成統一的接口如上圖所示(ODBC上方有一個唯一的接口)。圖中所示的ODBC層代表ODBC中各種數據庫的驅動器(driver),當SQL語句進入接口后,驅動器管理程序通過辨別將它們分別對應的進入各自的驅動器(driver),由驅動器來講SQL語句送入各種不同的數據庫。

         不知道上面這樣寫,有沒有把這個ODBC給介紹的明白一點兒,學習要生活化,這樣才容易理解。我來舉個例子。

         我們把ODBC假想成一輛汽車,汽車中有一名司機(driver),把下面的各種數據庫假設程不同的工廠。如果司機接收到接口中的命令(SQL語句)——將汽車上的貨物運到某個工廠中。那么司機(driver)會根據命令中所指明的貨物的類型,自己去辨別到底應該進入哪個工廠才能完成任務。

         大家看,上面這個例子中接收的命令就好像是數據庫中的SQL語句,那么司機就好像是驅動器(driver),而不同的工廠就好像是不同種類的數據庫。這樣理解,有沒有簡單一點兒呢?

2.OLEDB與ODBC

          好了,再來看一下OLEDB,在上面的例子中我們理解了ODBC,還有我們必須知道,ODBC負責的只是結構化數據庫的連接。這樣我們就會比較容易理解OLEDB。

OLEDB其實和ODBC類似,都是負責數據庫連接的低級接口。而OLEDB不僅支持結構化數據庫如SQL server,Oracel Access等,而且還支持非結構化數據源的連接如EXCEL等。

         OLEDB(對象連接和嵌入數據庫),是一組對象的集合,一種讀寫數據的方法。在使用OLEDB時,使用步驟為:初始化OLE、連接到數據源、發出命令、處理結果、釋放數據源對象並停止初始化OLE。他可以通過ODBC連接到數據庫,也可以之間連接到數據庫。當不通過ODBC時,這時在這其中並不涉及到驅動器的成分,因此,此時的數據庫連接速度會更快。同時,我們可以知道,只要支持ODBC的數據源是一定能夠支持OLEDB的。但是反過來則不一定。

3.ADO

      通過圖中,我們看到ADO是位於應用程序和OLEDB之間的。它屬於數據庫連接中的高層接口。

      是一個用於存取數據源的COM組件。它提供了編程語言和統一數據訪問方式OLE DB的一個中間層。允許開發人員編寫訪問數據的代碼而不用關心數據庫是如何實現的,而只用關心到數據庫的連接。訪問數據庫的時候,關於SQL的知識不是必要的,但是特定數據庫支持的SQL命令仍可以通過ADO中的命令對象來執行。

     如何理解上面這個概念呢?其實我們可以聯系我們學到的關於ADO控件的相關知識。在原來學習VB的時候,我們如果想要連接到數據庫的話,必須加載一個引用空間,里面含有connection,command,recordset等一些相關數據庫連接的對象,其實這個引用就是ADO。我們通過這些對象建立對數據庫的連接,我們只需編寫訪問數據庫的代碼,而並不用關系數據庫是如何實現的。

 

看完了三者的關系,讓我們來看看他們操作數據的速度如何,以打開access為例

性能對比:
                                         sql access    
                              oledb dsn oledb dsn
                    時間      18 82 62 99
查詢1,000條記錄: 100 150 2900 5400

顯然,oledb鏈接方式相對於dsn有很大的優勢.購買虛擬主機的小站,大多是php+mysql或者asp+access的組合,一般沒有dsn數據源的配置,而且我們也不需要.同時mssql是一種昂貴的數據庫,如果使用效率低下的access,我們應該盡量的減少數據庫引擎的壓力.我經常看見一些站點給出提示:數據庫連接失敗,顯然,又是access出毛病了.

常用的連接access的辦法:

oledb
openstr="provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)
odbc
openstr="Driver={Microsoft Access Driver (*.mdb)};DBQ=" &Server.Mappath(db)

這兩者在性能上也有一定的差別.下面是一個測試文件,對兩者進行比較.

<%
dim openmode,action,db,openstr,rs,conn
openmode=request.QueryString("openmode")
action=request.QueryString("action")
db="#niceidea.mdb"
set conn=server.createobject("adodb.connection")
if penmode="oledb" then penstr="provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)
if penmode="odbc" then penstr="Driver={Microsoft Access Driver (*.mdb)};DBQ=" &Server.Mappath(db)
Dim strStartTime
Dim strEndTime
strStartTime = Timer ''''''''''''''''''''''''''''''''開始時間
''''''''''''''''''''''''''''''''反復打開數據庫50次
if action="open" then
for i=1 to 50
conn.open(openstr)
conn.close
next
set conn=nothing
end if

''''''''''''''''''''''''''''''''移動記錄集10000次
if action="move" then
conn.open(openstr)
set rs=conn.execute("select * from visitor")
for i=1 to 10000
rs.movenext
next
rs.close
set rs=nothing
conn.close
set conn=nothing
end if

''''''''''''''''''''''''''''''''反復打開記錄集1000次
if action="getrs" then
conn.open(openstr)
set rs=server.CreateObject("adodb.recordset")
dim sqlstr
sqlstr="select * from visitor"
for i=1 to 1000
rs.open sqlstr,conn,1,1
rs.close
next
set rs=nothing
conn.close
set conn=nothing
end if
%>








 

 

 

 

 




<%
'''''''''''''''''''''''''''''''' 加載完畢的時間
strEndTime = Timer
Response.Write ("運行處理時間: ")
Response.Write 1000*(strEndTime - strStartTime)
Response.Write (" 毫秒.")
response.end
%>





得到的數據如下:

odbc反復打開數據庫50次:
6062.5 毫秒.
oledb反復打開數據庫50次:
4601.563毫秒.
odbc移動記錄集10000次:
1132.813 毫秒.
oledb移動記錄集10000次:
304.6875 毫秒.
odbc反復打開記錄集1000次:
8734.375 毫秒.
oledb反復打開記錄集1000次:
7960.938 毫秒.
測試環境,ce1.70/512m/windows xp sp2/withnetbox(不再開發的測試服務器)

顯然,在效率上,oledb有些微的優勢。微軟已經不更新ODBC,用JET方式連接數據庫是一種更有效率的辦法,特別是在需要移動游標的時候.另外,兩者還有一些其他方面的區別,oledb是一種更底層的方法,在這種數據庫連接方式中,應該注意的規范更多,就像用sql和access時候,某些查詢語句也會不一樣.例如:
select from user where id=1
將是一句錯誤的查詢語句,因為user是系統保留的關鍵字.需要改為
select from [user] where id=1
如果使用odbc連接,則不存在上述情況.
如果使用jet連接,在某些虛擬主機中可能會因為access版本的不同而導致連接失敗;所以你需要首先確定主機的引擎版本;在盡可能的情況下,使用以下語句打開access,將提高asp的效率,還有穩定性:
"provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)

此外,打開數據庫和記錄集對象都是很消耗cpu資源的,盡可能減少查詢是很必要的 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM