mysql odbc ado性能差异_ODBC、OLEDB和ADO之间的关系 ,以及性能比较
學(xué)習(xí)了.net視頻之后,對里面涉及到的數(shù)據(jù)庫連接部分中的一些概念表示很無語。網(wǎng)上很多相關(guān)資料,但除了網(wǎng)站不一樣外,基本上內(nèi)容都神一樣的一致。
現(xiàn)在,我就通過結(jié)合看到的一些資料再加上自己的理解試圖去解釋一下,有不對的,還請大家指教!
看一張圖:
看圖中右半部分,我們先來了解一下ODBC這個概念。
1.ODBC:
要了解ODBC是什么,先了解一下數(shù)據(jù)庫連接的相關(guān)知識。其實(shí),在最開始連接數(shù)據(jù)庫時,由于數(shù)據(jù)庫種類繁多,各種數(shù)據(jù)庫連接有不同的需求,這個時期,數(shù)據(jù)庫連接主要依靠各種API函數(shù)來進(jìn)行連接。而ODBC就是將這些API函數(shù)封裝起來形成統(tǒng)一的接口如上圖所示(ODBC上方有一個唯一的接口)。圖中所示的ODBC層代表ODBC中各種數(shù)據(jù)庫的驅(qū)動器(driver),當(dāng)SQL語句進(jìn)入接口后,驅(qū)動器管理程序通過辨別將它們分別對應(yīng)的進(jìn)入各自的驅(qū)動器(driver),由驅(qū)動器來講SQL語句送入各種不同的數(shù)據(jù)庫。
不知道上面這樣寫,有沒有把這個ODBC給介紹的明白一點(diǎn)兒,學(xué)習(xí)要生活化,這樣才容易理解。我來舉個例子。
我們把ODBC假想成一輛汽車,汽車中有一名司機(jī)(driver),把下面的各種數(shù)據(jù)庫假設(shè)程不同的工廠。如果司機(jī)接收到接口中的命令(SQL語句)——將汽車上的貨物運(yùn)到某個工廠中。那么司機(jī)(driver)會根據(jù)命令中所指明的貨物的類型,自己去辨別到底應(yīng)該進(jìn)入哪個工廠才能完成任務(wù)。
大家看,上面這個例子中接收的命令就好像是數(shù)據(jù)庫中的SQL語句,那么司機(jī)就好像是驅(qū)動器(driver),而不同的工廠就好像是不同種類的數(shù)據(jù)庫。這樣理解,有沒有簡單一點(diǎn)兒呢?
2.OLEDB與ODBC
好了,再來看一下OLEDB,在上面的例子中我們理解了ODBC,還有我們必須知道,ODBC負(fù)責(zé)的只是結(jié)構(gòu)化數(shù)據(jù)庫的連接。這樣我們就會比較容易理解OLEDB。
OLEDB其實(shí)和ODBC類似,都是負(fù)責(zé)數(shù)據(jù)庫連接的低級接口。而OLEDB不僅支持結(jié)構(gòu)化數(shù)據(jù)庫如SQL server,Oracel Access等,而且還支持非結(jié)構(gòu)化數(shù)據(jù)源的連接如EXCEL等。
OLEDB(對象連接和嵌入數(shù)據(jù)庫),是一組對象的集合,一種讀寫數(shù)據(jù)的方法。在使用OLEDB時,使用步驟為:初始化OLE、連接到數(shù)據(jù)源、發(fā)出命令、處理結(jié)果、釋放數(shù)據(jù)源對象并停止初始化OLE。他可以通過ODBC連接到數(shù)據(jù)庫,也可以之間連接到數(shù)據(jù)庫。當(dāng)不通過ODBC時,這時在這其中并不涉及到驅(qū)動器的成分,因此,此時的數(shù)據(jù)庫連接速度會更快。同時,我們可以知道,只要支持ODBC的數(shù)據(jù)源是一定能夠支持OLEDB的。但是反過來則不一定。
3.ADO
通過圖中,我們看到ADO是位于應(yīng)用程序和OLEDB之間的。它屬于數(shù)據(jù)庫連接中的高層接口。
是一個用于存取數(shù)據(jù)源的COM組件。它提供了編程語言和統(tǒng)一數(shù)據(jù)訪問方式OLE DB的一個中間層。允許開發(fā)人員編寫訪問數(shù)據(jù)的代碼而不用關(guān)心數(shù)據(jù)庫是如何實(shí)現(xiàn)的,而只用關(guān)心到數(shù)據(jù)庫的連接。訪問數(shù)據(jù)庫的時候,關(guān)于SQL的知識不是必要的,但是特定數(shù)據(jù)庫支持的SQL命令仍可以通過ADO中的命令對象來執(zhí)行。
如何理解上面這個概念呢?其實(shí)我們可以聯(lián)系我們學(xué)到的關(guān)于ADO控件的相關(guān)知識。在原來學(xué)習(xí)VB的時候,我們?nèi)绻胍B接到數(shù)據(jù)庫的話,必須加載一個引用空間,里面含有connection,command,recordset等一些相關(guān)數(shù)據(jù)庫連接的對象,其實(shí)這個引用就是ADO。我們通過這些對象建立對數(shù)據(jù)庫的連接,我們只需編寫訪問數(shù)據(jù)庫的代碼,而并不用關(guān)系數(shù)據(jù)庫是如何實(shí)現(xiàn)的。
看完了三者的關(guān)系,讓我們來看看他們操作數(shù)據(jù)的速度如何,以打開access為例
性能對比:
sql access
oledb dsn oledb dsn
時間????? 18 82 62 99
查詢1,000條記錄: 100 150 2900 5400
顯然,oledb鏈接方式相對于dsn有很大的優(yōu)勢.購買虛擬主機(jī)的小站,大多是php+mysql或者asp+access的組合,一般沒有dsn數(shù)據(jù)源的配置,而且我們也不需要.同時mssql是一種昂貴的數(shù)據(jù)庫,如果使用效率低下的access,我們應(yīng)該盡量的減少數(shù)據(jù)庫引擎的壓力.我經(jīng)常看見一些站點(diǎn)給出提示:數(shù)據(jù)庫連接失敗,顯然,又是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)
這兩者在性能上也有一定的差別.下面是一個測試文件,對兩者進(jìn)行比較.
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 ''''''''''''''''''''''''''''''''開始時間
''''''''''''''''''''''''''''''''反復(fù)打開數(shù)據(jù)庫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
''''''''''''''''''''''''''''''''反復(fù)打開記錄集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 ("運(yùn)行處理時間: ")
Response.Write 1000*(strEndTime - strStartTime)
Response.Write (" 毫秒.")
response.end
%>
得到的數(shù)據(jù)如下:
odbc反復(fù)打開數(shù)據(jù)庫50次:
6062.5 毫秒.
oledb反復(fù)打開數(shù)據(jù)庫50次:
4601.563毫秒.
odbc移動記錄集10000次:
1132.813 毫秒.
oledb移動記錄集10000次:
304.6875 毫秒.
odbc反復(fù)打開記錄集1000次:
8734.375 毫秒.
oledb反復(fù)打開記錄集1000次:
7960.938 毫秒.
測試環(huán)境,ce1.70/512m/windows xp sp2/withnetbox(不再開發(fā)的測試服務(wù)器)
顯然,在效率上,oledb有些微的優(yōu)勢。微軟已經(jīng)不更新ODBC,用JET方式連接數(shù)據(jù)庫是一種更有效率的辦法,特別是在需要移動游標(biāo)的時候.另外,兩者還有一些其他方面的區(qū)別,oledb是一種更底層的方法,在這種數(shù)據(jù)庫連接方式中,應(yīng)該注意的規(guī)范更多,就像用sql和access時候,某些查詢語句也會不一樣.例如:
select from user where id=1
將是一句錯誤的查詢語句,因?yàn)閡ser是系統(tǒng)保留的關(guān)鍵字.需要改為
select from [user] where id=1
如果使用odbc連接,則不存在上述情況.
如果使用jet連接,在某些虛擬主機(jī)中可能會因?yàn)閍ccess版本的不同而導(dǎo)致連接失敗;所以你需要首先確定主機(jī)的引擎版本;在盡可能的情況下,使用以下語句打開access,將提高asp的效率,還有穩(wěn)定性:
"provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)
此外,打開數(shù)據(jù)庫和記錄集對象都是很消耗cpu資源的,盡可能減少查詢是很必要的
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的mysql odbc ado性能差异_ODBC、OLEDB和ADO之间的关系 ,以及性能比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洗头膏去屑止痒哪个牌子好(好用去油止痒去
- 下一篇: unzip不能解压mysql的zip_L