ado資料庫訪問的最優方法
幾乎所有關於ado資料庫訪問效能分析的文章,都認為二進位制元件的效能總是超過解釋執行的asp**。事實上,這是錯誤的。從本文的測試結果可以看出,有些時候asp**的效能遠遠超過了元件。
一、引言
「地球是平坦的...」;
「太陽繞著地球轉...」;
「總是通過元件訪問資料庫...」,
上面三個命題有兩個共同的特點:首先,它們都曾經被認為是正確的;其次,這三個命題實際上都是錯誤的。
我們都已經讀到過無數的文章建議在internet應用中用元件封裝業務邏輯和進行資料庫訪問,但有關這種技術的實際效能資料卻很少看到。隨著windows 2000的發行,iis平台特別是asp的效能表現也有了顯著的提高。由於先行繫結(early-binding)內部物件、模板緩衝等諸多改進,在通過ado訪問資料庫、格式化並輸出記錄集等各個方面,asp都有一流的效能表現。
從本文測試結果可以看出,asp在ado資料庫訪問、記錄集格式化方面勝過元件,而且在某些情形下兩者的差異達到了難以置信的程度。對於大多數internet應用來說,效能總是首要因素,所以在根據傳聞或書本知識確定最優方案之前,使用測試工具對方案進行完整的測試是很重要的。
在進行測試之前,本文的所有三組**(asp,vb和c++)都經過了優化。為了確保參與測試的**其編碼方法和測試結果都是各自領域中最優的,它們都經過了多次測試。某些優化工作尚未進行,這是為了讓**更真實地反映出實際應用環境中可能出現的典型情況。
二、測試環境
本次測試只在windows 2000平台上進行,在windows nt平台上測試結果可能會有很大的不同,所以測試所得到的結果不適用於windows nt平台。下面是本次測試所用系統的示意圖及其說明:
由於測試客戶機和web伺服器、資料庫伺服器所處的物理位置不同,客戶機通過三個cisco 2924交換機連線到web伺服器。所有這些機器都在同一大樓內,但伺服器位於資料中心,而測試客戶機位於另乙個房間,客戶機通過乙個400mb fast etherchannel連線到資料中心的交換機。
在這個配置下,測試案例的網路延遲所引起的開銷是非常小的。在日常執行中交換機之間的流量總是小於其能力的5%。
三、測試**
使用odbc dsn建立/開啟乙個資料庫連線
建立乙個command物件(設定其型別為adcmdstoreproc)
指定返回記錄數量的引數
執行命令,返回記錄集
關閉記錄集和連線,釋放這些物件占用的記憶體。
可以證實上述方法具有最快的資料庫訪問速度,這是因為:
儲存過程訪問速度要比動態sql快,即使啟用了sqlserver 7.0的sql計畫快取功能也一樣。
使用command物件並顯式地指定引數要比傳入乙個查詢字串快得多,這是因為此時oledb提供者無需分析查詢型別以及所有傳遞給儲存過程的引數的型別。
odbc連線池避免了為每乙個開啟命令建立物理連線。每次關閉連線將把已開啟的連線釋放回連線池。
結構,這是為了能夠讓測試程式更加精確地模擬出實際的記錄集處理過程。 返回給客戶端的html**是從乙個兩列的記錄集建立的結構。所有測試程式都用while迴圈遍歷記錄集,而不是用速度更快的getstring方法直接從記錄集資料得到結構,這是為了能夠讓測試程式更加精確地模擬出實際的記錄集處理過程。
測試所用的儲存過程從表中提取記錄,返回記錄的數量以引數形式傳遞給儲存過程。
測試以多種不同的記錄數量和執行緒數量(併發請求數量)執行。記錄數量的範圍從0行到100行,但沒有測試超過100行的返回記錄數量,這是因為考慮到大多數設計良好的web應用不會出現如此大規模的記錄集資料提取和格式化操作。
所有測試指令碼均在網路利用率最低的時候執行。此外,測試期間iis/com+伺服器和sql server上都沒有進行其他操作。
iis的「應用程式保護」設定成「低」,這使得應用執行具有最好的效能,特別是對com+庫應用的測試來說尤其如此。這個設定同時也允許了所有任務在inetinfo程序內執行。
ADO資料庫訪問的最優方法
幾乎所有關於ado資料庫訪問效能分析的文章,都認為二進位制元件的效能總是超過解釋執行的asp 事實上,這是錯誤的。從本文的測試結果可以看出,有些時候asp 的效能遠遠超過了元件。一 引言 地球是平坦的.太陽繞著地球轉.總是通過元件訪問資料庫.上面三個命題有兩個共同的特點 首先,它們都曾經被認為是正確...
ADO訪問資料庫的方法
現將 ado訪問資料庫的基本步驟和方法介紹如下 第一步 在 stdafx.h 中新增 import c program files common files system ado msado15.dll no namespace rename eof adoeof 第二步 初始化 com環境 在合適...
ADO 訪問資料庫
using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system.window...