亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于ASP動(dòng)態(tài)網(wǎng)站開發(fā)過程中的數(shù)據(jù)庫(kù)優(yōu)化處理

        2014-12-13 16:01:33賈瑞鳳馬曾
        關(guān)鍵詞:數(shù)據(jù)庫(kù)

        賈瑞鳳++馬曾

        摘要:建立高性能的網(wǎng)站,離不開ASP與數(shù)據(jù)庫(kù)之間處理性能的優(yōu)化,本質(zhì)上就是設(shè)法降低Web服務(wù)器執(zhí)行ASP頁(yè)面的開銷以及數(shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān)。在優(yōu)化過程中重點(diǎn)考慮創(chuàng)建數(shù)據(jù)庫(kù)連接池,使用直接的OLE DB驅(qū)動(dòng)程序,正確設(shè)置Command、Recordset的參數(shù)值,在內(nèi)存中緩存ADO對(duì)象或其內(nèi)容,使用優(yōu)化過的SQL語(yǔ)句等。

        關(guān)鍵詞:數(shù)據(jù)庫(kù) ASP Connection Command Recordset

        中圖分類號(hào):TP31 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2014)08-0077-02

        隨著Web數(shù)據(jù)庫(kù)的應(yīng)用越來越多,用戶對(duì)訪問Web數(shù)據(jù)庫(kù)頁(yè)面的速度要求也越來越高。訪問Web頁(yè)面速度的快慢不僅取決于網(wǎng)絡(luò)的速度、Web頁(yè)面所在服務(wù)器的性能,還取決于Web頁(yè)面本身的設(shè)計(jì)等多方面原因。因?yàn)榇蟛糠志W(wǎng)站信息都存儲(chǔ)在數(shù)據(jù)庫(kù)中,而且典型的ASP頁(yè)面工作原理是從后臺(tái)數(shù)據(jù)庫(kù)中檢索數(shù)據(jù),然后將結(jié)果以HTML的形式向客戶端輸出,所以,要提高Web服務(wù)器的響應(yīng)速度,建立高性能的網(wǎng)站,離不開ASP與數(shù)據(jù)庫(kù)之間處理性能的優(yōu)化。優(yōu)化的原則就是設(shè)法降低Web服務(wù)器執(zhí)行ASP頁(yè)面的開銷以及數(shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān)。

        1 數(shù)據(jù)庫(kù)連接優(yōu)化

        在WEB程序應(yīng)用中,建立數(shù)據(jù)庫(kù)連接會(huì)開銷大量資源,同時(shí),用戶還需要一段等待連接的時(shí)間。如果很多用戶在訪問不同頁(yè)面時(shí)都需要執(zhí)行建立數(shù)據(jù)庫(kù)連接,系統(tǒng)有可能會(huì)由于資源消耗過大而停止響應(yīng)。因此,考慮用戶建立一個(gè)連接,而且不同用戶在訪問網(wǎng)站不同頁(yè)面時(shí)可以重復(fù)使用這一個(gè)數(shù)據(jù)庫(kù)連接,而不是再重新建立連接,就可以解決數(shù)據(jù)庫(kù)連接造成資源開銷大的問題,從而提高整個(gè)系統(tǒng)的性能。在IIS十ASP處理體系中,可以采用連接池(Connection poo1)機(jī)制來保證。

        連接池原理:在IIS+ASP中建立一個(gè)存放數(shù)據(jù)庫(kù)連接的緩沖池,存放在緩沖池中數(shù)據(jù)庫(kù)連接是物理連接的,并且在其中被維護(hù)。當(dāng)執(zhí)行ASP程序中時(shí),斷開數(shù)據(jù)庫(kù)連接是邏輯斷開。因此,當(dāng)下一個(gè)用戶訪問時(shí),就可以直接從連接沖池中應(yīng)用數(shù)據(jù)庫(kù)連接,而不需再次連接數(shù)據(jù)庫(kù),這樣可以極大地提高系統(tǒng)響應(yīng)速度。可使用以下方法對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行操作:

        (1)創(chuàng)建連接對(duì)象,Set conn=Sever.CreateObject("ADODB.connection")。

        (2)建立連接,conn.open Application(“strConn”),……

        (3)進(jìn)行數(shù)據(jù)庫(kù)操作:……

        (4)關(guān)閉連接對(duì)象:conn.close。

        2 數(shù)據(jù)庫(kù)命令的優(yōu)化

        Command對(duì)象的功能是執(zhí)行數(shù)據(jù)庫(kù)操作,對(duì)它的優(yōu)化也可以提高數(shù)據(jù)庫(kù)操作效率。

        2.1 正確設(shè)置CommandType屬性

        適當(dāng)設(shè)置CommnandType屬性提高SQL語(yǔ)句執(zhí)行效率需要注意:

        (1)執(zhí)行普通的SQL語(yǔ)句用adCmdText。

        如:ObjCmd.Execute "SELECT * FROM User WHERE [Name]=trfsoft",adCmdText

        (2)選取一個(gè)表的所有字段用adCmdTable。

        如:ObjCmd.Execute "SELECT * FROM table_name", adCmdText

        可替換為:ObjCmd.Execute "table_name", adCmdTable

        (3)執(zhí)行存儲(chǔ)過程使用adCmdStoredProc。

        如:ObjCmd.Execute "Exec proceuure_name", adCmdText

        可替換為:ObjCmd.Execute "proceuure_name", adCmdStoredProc

        (4)沒有返回值的數(shù)據(jù)庫(kù)操作用adExcuteNoRecords。

        很重要的一點(diǎn)是,如果SQL語(yǔ)句沒有返回記錄集,如INSERT和UPDATE等,那么使用adExecuteNoRecords(ADO2.0以后版本)可以降低系統(tǒng)開銷。

        2.2 設(shè)置Prepared屬性預(yù)編譯SQL語(yǔ)句

        當(dāng)重復(fù)執(zhí)行SQL語(yǔ)句時(shí),可以設(shè)置Comnand.Prepared屬性為Ture來預(yù)編譯SQL語(yǔ)句,通過這種方式提高的效率也很可觀,如下面的代碼:

        3 對(duì)記錄集RecordSet的優(yōu)化

        RecordSet對(duì)象用來操作一個(gè)記錄集,它有三個(gè)與性能關(guān)系比較重要的屬性,分別是LockType、CusorType和CursorLocation,這三個(gè)屬性的設(shè)置對(duì)RecordSet的性能影響特別大。

        3.1 正確設(shè)置LockType屬性

        LockType屬性是指對(duì)記錄集的鎖定方式,它的取值有以下幾種:

        adLockReadOnly:默認(rèn)值,以只讀方式打開數(shù)據(jù)源,因而無法更改或刪除數(shù)據(jù)。

        adLockPessimistic:在打開記錄集時(shí)立即鎖定數(shù)據(jù)源。此時(shí),其他用戶不能訪問該數(shù)據(jù)庫(kù)。

        adLockOptimistic:只在調(diào)用Update方法時(shí)鎖定記錄,鎖定期間其他用戶不能訪問該數(shù)據(jù)庫(kù),Update執(zhí)行完畢后自動(dòng)解鎖。

        adLockBatchOptimistic:用于成批更新數(shù)據(jù),與UpdateBatch方法相對(duì)應(yīng)。

        LockType屬性默認(rèn)是adLockReadOnly,如果不用修改數(shù)據(jù),就不要改成adLockOptimistic之類的,否則也會(huì)降低速度和增加開銷。在使用時(shí)只要夠用即可,以減小系統(tǒng)開銷,提高效率。它們的系統(tǒng)開銷由小到大依次如下:

        adLockReadOnly < adLockPessimistic < adLockOptimistic < adLockBatchOptimistic

        3.2 正確設(shè)置CursorType屬性

        CursorType屬性是指記錄集的游標(biāo)類型,它的取值有以下幾種:

        adOpeoForwardOnly:默認(rèn)值,只能在記錄中向前滾動(dòng),這可以節(jié)省資源并提高性能,但此時(shí)只能調(diào)用MoveNext,無法調(diào)用MoveFoWard和RecordCount。

        adOpenDynamic:可以看見其他用戶所做的添加、更改和刪除操作。允許在記錄集中進(jìn)行所有類型的移動(dòng)。

        adOpenKeyset:與adOpenDynamic相似,不同的只是禁止查看其他用戶添加的記錄,并禁止訪問其他用戶刪除的記錄,其他用戶所做的數(shù)據(jù)更改將依然可見。

        adOpenStatic:可以用來查找數(shù)據(jù)或生成報(bào)告的記錄集的靜態(tài)副本。另外,對(duì)其他用戶所做的添加、更改或刪除操作不可見。

        CursorType屬性默認(rèn)是adOpenForwardOnIy,如果只用MoveNextMethod,最好不要修改,但如果想使用RecordCount屬性,只能用adOpenKeyset或adOpenStatic。它們的系統(tǒng)開銷由小到大依次如下:

        adOpeoForwardOnly < adOpenDynamic < adOpenKeyset < adOpenStatic

        3.3 正確設(shè)置CursorLocation屬性

        CursorLocation屬性默認(rèn)是adUseSever,其實(shí)這樣不好,它可以隨時(shí)反映數(shù)據(jù)庫(kù)服務(wù)器上的改動(dòng),使得系統(tǒng)開銷很大,而且需要維持和數(shù)據(jù)庫(kù)服務(wù)器的連接,但是數(shù)據(jù)庫(kù)服務(wù)器和Web Server在一起的時(shí)候要快些。如果對(duì)數(shù)據(jù)的實(shí)時(shí)性沒有要求的話,則盡量使用adUseClient,使用adUseClient時(shí)可以對(duì)數(shù)據(jù)做再排序、篩選操作。

        經(jīng)過對(duì)上面三個(gè)屬性的解釋和分析,在使用時(shí)可以注意以下事項(xiàng):

        (1)檢索數(shù)據(jù),使用默認(rèn)值。

        (2)更新一條數(shù)據(jù),則LockTyPe屬性使用adLockOptimistic;成批更新數(shù)據(jù),則LockType屬性使用adLockBatchOptimistic。

        (3)寫入數(shù)據(jù)庫(kù),CursorType屬性一般使用adOpenKeyset。

        (4)用RecordCount屬性來獲得記錄總數(shù),CursorType設(shè)置為adOpenKeyset或adOpenStatic。

        4 其它優(yōu)化方法

        4.1 在內(nèi)存中緩存ADO對(duì)象或其內(nèi)容

        無論數(shù)據(jù)庫(kù)的速度如何,從內(nèi)存中檢索數(shù)據(jù)要比從后臺(tái)數(shù)據(jù)庫(kù)檢索數(shù)據(jù)快得多,而且從本地硬盤讀取數(shù)據(jù)通常也比從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)快,所以事先把一些常用信息存放在內(nèi)存中,當(dāng)用戶訪問時(shí),直接從內(nèi)存中取出,提交給用戶,以減小系統(tǒng)壓力,提高響應(yīng)速度。例如,把獲得數(shù)據(jù)的RecordSet對(duì)象存放在Application變量中,用戶訪問時(shí),直接從Application變量中獲取RecordSet對(duì)象;也可以將RecordSet對(duì)象數(shù)據(jù)存放在數(shù)組中,然后再將數(shù)組存儲(chǔ)在Application變量中,使用時(shí)用數(shù)組的方式讀取等。

        緩存是典型的以空間換取時(shí)間的做法。如果緩存的內(nèi)容正確,那么可以看到性能會(huì)有顯著的提高。為使緩存有效,必須保存那些經(jīng)常重復(fù)使用的,并且重新計(jì)算需要付出較大代價(jià)的數(shù)據(jù)。如果緩存的都是不常用的數(shù)據(jù),反而會(huì)造成內(nèi)存浪費(fèi)。

        4.2 使用存儲(chǔ)過程

        在站點(diǎn)中,可能存在多次查詢大量信息,用于判斷,然后更新入庫(kù)。這種情況如果在編寫ASP時(shí),直接在一個(gè)程序中多次操作數(shù)據(jù)庫(kù),不僅需要IIS創(chuàng)建很多ADO對(duì)象,加大開銷,而且還會(huì)加重?cái)?shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān),增大網(wǎng)絡(luò)流量。如果把多次數(shù)據(jù)庫(kù)操作流程定義為一個(gè)存儲(chǔ)過程,用如下方式調(diào)用:

        Objcmd.Execute "Exec proceuure_name" , adCmdText

        就可以利用數(shù)據(jù)庫(kù)本身的強(qiáng)大性能,減輕Web服務(wù)器的壓力,而且由于頁(yè)面內(nèi)容與業(yè)務(wù)分開,管理維護(hù)也變得方便。

        4.3 僅選擇所需的字段

        使用ADO記錄集中的數(shù)據(jù)表時(shí),盡量避免自動(dòng)使用表名(即SELECT*),除非想使用其中所有字段中的數(shù)據(jù)。如果只選擇需要的字段,將減少發(fā)送到服務(wù)器或從服務(wù)器取出的數(shù)據(jù)量。即使需要使用全部字段列,單獨(dú)命名每個(gè)字段列也會(huì)獲得最佳的性能,因?yàn)榉?wù)器不必再解釋這些列的名字。

        4.4 使用優(yōu)化過的SQL語(yǔ)句

        在ASP技術(shù)中,ADO對(duì)象會(huì)消耗大量資源,執(zhí)行一個(gè)SQL語(yǔ)句需要很長(zhǎng)時(shí)間,一直占用整個(gè)資源,導(dǎo)致系統(tǒng)不能有足夠的資源為其他用戶服務(wù)。ADO是通用對(duì)象控件,沒有利用數(shù)據(jù)庫(kù)的特性。如果結(jié)合數(shù)據(jù)庫(kù)特性來編寫ASP程序,可以有效地釋放資源。例如,對(duì)于已經(jīng)執(zhí)行過的Sql語(yǔ)句,Oracle數(shù)據(jù)庫(kù)服務(wù)器通常都經(jīng)過了分析優(yōu)化,并存儲(chǔ)在一個(gè)Sql內(nèi)存緩沖區(qū)中,當(dāng)下次接收到同樣的sql語(yǔ)句請(qǐng)求時(shí),直接從內(nèi)存緩沖區(qū)取出執(zhí)行,不再進(jìn)行分析優(yōu)化,從而可以大幅度提高性能。這就要求編寫ASP程序時(shí),盡量使用相同的Sql語(yǔ)句,或者參數(shù)化的Sql語(yǔ)句,比如,不使用在IN語(yǔ)句中包含子查詢的語(yǔ)句,充分利用索引,設(shè)置Command.Prepared屬性預(yù)編譯SQL語(yǔ)句:

        Set cmd=Server.createobject(“adodb.command”)

        cmd.CommandText=”select * from product where productcode=?”

        4.5 需用時(shí)創(chuàng)建,用完即釋放

        ADO對(duì)象是非常消耗資源的,因此,只有在用到ADO對(duì)象時(shí)再創(chuàng)建它,用完后馬上釋放:

        set rs=Server.createobject(“adodb.recordset”)

        ….

        rs.close

        set rs=nothing

        對(duì)數(shù)據(jù)庫(kù)的優(yōu)化處理可以使Web頁(yè)面的瀏覽速度在其它條件不變的情況下得到大大提升,在大型網(wǎng)站中數(shù)據(jù)庫(kù)的優(yōu)化顯得龍為重要。

        參考文獻(xiàn)

        [1]郭瑞軍,李杰,初曉璐.數(shù)據(jù)庫(kù)開發(fā)實(shí)例精粹[M].北京.電子工業(yè)出版社,2005.05.

        [2]頊宇峰,馬軍.ASP網(wǎng)絡(luò)編程從入門到精通[M].北京.清華大學(xué)出版社,2006.07.

        [3]周興華,王敬棟.ASP+Access數(shù)據(jù)庫(kù)開發(fā)與實(shí)例[M].北京.清華大學(xué)出版社,2006.09.

        adLockReadOnly < adLockPessimistic < adLockOptimistic < adLockBatchOptimistic

        3.2 正確設(shè)置CursorType屬性

        CursorType屬性是指記錄集的游標(biāo)類型,它的取值有以下幾種:

        adOpeoForwardOnly:默認(rèn)值,只能在記錄中向前滾動(dòng),這可以節(jié)省資源并提高性能,但此時(shí)只能調(diào)用MoveNext,無法調(diào)用MoveFoWard和RecordCount。

        adOpenDynamic:可以看見其他用戶所做的添加、更改和刪除操作。允許在記錄集中進(jìn)行所有類型的移動(dòng)。

        adOpenKeyset:與adOpenDynamic相似,不同的只是禁止查看其他用戶添加的記錄,并禁止訪問其他用戶刪除的記錄,其他用戶所做的數(shù)據(jù)更改將依然可見。

        adOpenStatic:可以用來查找數(shù)據(jù)或生成報(bào)告的記錄集的靜態(tài)副本。另外,對(duì)其他用戶所做的添加、更改或刪除操作不可見。

        CursorType屬性默認(rèn)是adOpenForwardOnIy,如果只用MoveNextMethod,最好不要修改,但如果想使用RecordCount屬性,只能用adOpenKeyset或adOpenStatic。它們的系統(tǒng)開銷由小到大依次如下:

        adOpeoForwardOnly < adOpenDynamic < adOpenKeyset < adOpenStatic

        3.3 正確設(shè)置CursorLocation屬性

        CursorLocation屬性默認(rèn)是adUseSever,其實(shí)這樣不好,它可以隨時(shí)反映數(shù)據(jù)庫(kù)服務(wù)器上的改動(dòng),使得系統(tǒng)開銷很大,而且需要維持和數(shù)據(jù)庫(kù)服務(wù)器的連接,但是數(shù)據(jù)庫(kù)服務(wù)器和Web Server在一起的時(shí)候要快些。如果對(duì)數(shù)據(jù)的實(shí)時(shí)性沒有要求的話,則盡量使用adUseClient,使用adUseClient時(shí)可以對(duì)數(shù)據(jù)做再排序、篩選操作。

        經(jīng)過對(duì)上面三個(gè)屬性的解釋和分析,在使用時(shí)可以注意以下事項(xiàng):

        (1)檢索數(shù)據(jù),使用默認(rèn)值。

        (2)更新一條數(shù)據(jù),則LockTyPe屬性使用adLockOptimistic;成批更新數(shù)據(jù),則LockType屬性使用adLockBatchOptimistic。

        (3)寫入數(shù)據(jù)庫(kù),CursorType屬性一般使用adOpenKeyset。

        (4)用RecordCount屬性來獲得記錄總數(shù),CursorType設(shè)置為adOpenKeyset或adOpenStatic。

        4 其它優(yōu)化方法

        4.1 在內(nèi)存中緩存ADO對(duì)象或其內(nèi)容

        無論數(shù)據(jù)庫(kù)的速度如何,從內(nèi)存中檢索數(shù)據(jù)要比從后臺(tái)數(shù)據(jù)庫(kù)檢索數(shù)據(jù)快得多,而且從本地硬盤讀取數(shù)據(jù)通常也比從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)快,所以事先把一些常用信息存放在內(nèi)存中,當(dāng)用戶訪問時(shí),直接從內(nèi)存中取出,提交給用戶,以減小系統(tǒng)壓力,提高響應(yīng)速度。例如,把獲得數(shù)據(jù)的RecordSet對(duì)象存放在Application變量中,用戶訪問時(shí),直接從Application變量中獲取RecordSet對(duì)象;也可以將RecordSet對(duì)象數(shù)據(jù)存放在數(shù)組中,然后再將數(shù)組存儲(chǔ)在Application變量中,使用時(shí)用數(shù)組的方式讀取等。

        緩存是典型的以空間換取時(shí)間的做法。如果緩存的內(nèi)容正確,那么可以看到性能會(huì)有顯著的提高。為使緩存有效,必須保存那些經(jīng)常重復(fù)使用的,并且重新計(jì)算需要付出較大代價(jià)的數(shù)據(jù)。如果緩存的都是不常用的數(shù)據(jù),反而會(huì)造成內(nèi)存浪費(fèi)。

        4.2 使用存儲(chǔ)過程

        在站點(diǎn)中,可能存在多次查詢大量信息,用于判斷,然后更新入庫(kù)。這種情況如果在編寫ASP時(shí),直接在一個(gè)程序中多次操作數(shù)據(jù)庫(kù),不僅需要IIS創(chuàng)建很多ADO對(duì)象,加大開銷,而且還會(huì)加重?cái)?shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān),增大網(wǎng)絡(luò)流量。如果把多次數(shù)據(jù)庫(kù)操作流程定義為一個(gè)存儲(chǔ)過程,用如下方式調(diào)用:

        Objcmd.Execute "Exec proceuure_name" , adCmdText

        就可以利用數(shù)據(jù)庫(kù)本身的強(qiáng)大性能,減輕Web服務(wù)器的壓力,而且由于頁(yè)面內(nèi)容與業(yè)務(wù)分開,管理維護(hù)也變得方便。

        4.3 僅選擇所需的字段

        使用ADO記錄集中的數(shù)據(jù)表時(shí),盡量避免自動(dòng)使用表名(即SELECT*),除非想使用其中所有字段中的數(shù)據(jù)。如果只選擇需要的字段,將減少發(fā)送到服務(wù)器或從服務(wù)器取出的數(shù)據(jù)量。即使需要使用全部字段列,單獨(dú)命名每個(gè)字段列也會(huì)獲得最佳的性能,因?yàn)榉?wù)器不必再解釋這些列的名字。

        4.4 使用優(yōu)化過的SQL語(yǔ)句

        在ASP技術(shù)中,ADO對(duì)象會(huì)消耗大量資源,執(zhí)行一個(gè)SQL語(yǔ)句需要很長(zhǎng)時(shí)間,一直占用整個(gè)資源,導(dǎo)致系統(tǒng)不能有足夠的資源為其他用戶服務(wù)。ADO是通用對(duì)象控件,沒有利用數(shù)據(jù)庫(kù)的特性。如果結(jié)合數(shù)據(jù)庫(kù)特性來編寫ASP程序,可以有效地釋放資源。例如,對(duì)于已經(jīng)執(zhí)行過的Sql語(yǔ)句,Oracle數(shù)據(jù)庫(kù)服務(wù)器通常都經(jīng)過了分析優(yōu)化,并存儲(chǔ)在一個(gè)Sql內(nèi)存緩沖區(qū)中,當(dāng)下次接收到同樣的sql語(yǔ)句請(qǐng)求時(shí),直接從內(nèi)存緩沖區(qū)取出執(zhí)行,不再進(jìn)行分析優(yōu)化,從而可以大幅度提高性能。這就要求編寫ASP程序時(shí),盡量使用相同的Sql語(yǔ)句,或者參數(shù)化的Sql語(yǔ)句,比如,不使用在IN語(yǔ)句中包含子查詢的語(yǔ)句,充分利用索引,設(shè)置Command.Prepared屬性預(yù)編譯SQL語(yǔ)句:

        Set cmd=Server.createobject(“adodb.command”)

        cmd.CommandText=”select * from product where productcode=?”

        4.5 需用時(shí)創(chuàng)建,用完即釋放

        ADO對(duì)象是非常消耗資源的,因此,只有在用到ADO對(duì)象時(shí)再創(chuàng)建它,用完后馬上釋放:

        set rs=Server.createobject(“adodb.recordset”)

        ….

        rs.close

        set rs=nothing

        對(duì)數(shù)據(jù)庫(kù)的優(yōu)化處理可以使Web頁(yè)面的瀏覽速度在其它條件不變的情況下得到大大提升,在大型網(wǎng)站中數(shù)據(jù)庫(kù)的優(yōu)化顯得龍為重要。

        參考文獻(xiàn)

        [1]郭瑞軍,李杰,初曉璐.數(shù)據(jù)庫(kù)開發(fā)實(shí)例精粹[M].北京.電子工業(yè)出版社,2005.05.

        [2]頊宇峰,馬軍.ASP網(wǎng)絡(luò)編程從入門到精通[M].北京.清華大學(xué)出版社,2006.07.

        [3]周興華,王敬棟.ASP+Access數(shù)據(jù)庫(kù)開發(fā)與實(shí)例[M].北京.清華大學(xué)出版社,2006.09.

        adLockReadOnly < adLockPessimistic < adLockOptimistic < adLockBatchOptimistic

        3.2 正確設(shè)置CursorType屬性

        CursorType屬性是指記錄集的游標(biāo)類型,它的取值有以下幾種:

        adOpeoForwardOnly:默認(rèn)值,只能在記錄中向前滾動(dòng),這可以節(jié)省資源并提高性能,但此時(shí)只能調(diào)用MoveNext,無法調(diào)用MoveFoWard和RecordCount。

        adOpenDynamic:可以看見其他用戶所做的添加、更改和刪除操作。允許在記錄集中進(jìn)行所有類型的移動(dòng)。

        adOpenKeyset:與adOpenDynamic相似,不同的只是禁止查看其他用戶添加的記錄,并禁止訪問其他用戶刪除的記錄,其他用戶所做的數(shù)據(jù)更改將依然可見。

        adOpenStatic:可以用來查找數(shù)據(jù)或生成報(bào)告的記錄集的靜態(tài)副本。另外,對(duì)其他用戶所做的添加、更改或刪除操作不可見。

        CursorType屬性默認(rèn)是adOpenForwardOnIy,如果只用MoveNextMethod,最好不要修改,但如果想使用RecordCount屬性,只能用adOpenKeyset或adOpenStatic。它們的系統(tǒng)開銷由小到大依次如下:

        adOpeoForwardOnly < adOpenDynamic < adOpenKeyset < adOpenStatic

        3.3 正確設(shè)置CursorLocation屬性

        CursorLocation屬性默認(rèn)是adUseSever,其實(shí)這樣不好,它可以隨時(shí)反映數(shù)據(jù)庫(kù)服務(wù)器上的改動(dòng),使得系統(tǒng)開銷很大,而且需要維持和數(shù)據(jù)庫(kù)服務(wù)器的連接,但是數(shù)據(jù)庫(kù)服務(wù)器和Web Server在一起的時(shí)候要快些。如果對(duì)數(shù)據(jù)的實(shí)時(shí)性沒有要求的話,則盡量使用adUseClient,使用adUseClient時(shí)可以對(duì)數(shù)據(jù)做再排序、篩選操作。

        經(jīng)過對(duì)上面三個(gè)屬性的解釋和分析,在使用時(shí)可以注意以下事項(xiàng):

        (1)檢索數(shù)據(jù),使用默認(rèn)值。

        (2)更新一條數(shù)據(jù),則LockTyPe屬性使用adLockOptimistic;成批更新數(shù)據(jù),則LockType屬性使用adLockBatchOptimistic。

        (3)寫入數(shù)據(jù)庫(kù),CursorType屬性一般使用adOpenKeyset。

        (4)用RecordCount屬性來獲得記錄總數(shù),CursorType設(shè)置為adOpenKeyset或adOpenStatic。

        4 其它優(yōu)化方法

        4.1 在內(nèi)存中緩存ADO對(duì)象或其內(nèi)容

        無論數(shù)據(jù)庫(kù)的速度如何,從內(nèi)存中檢索數(shù)據(jù)要比從后臺(tái)數(shù)據(jù)庫(kù)檢索數(shù)據(jù)快得多,而且從本地硬盤讀取數(shù)據(jù)通常也比從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)快,所以事先把一些常用信息存放在內(nèi)存中,當(dāng)用戶訪問時(shí),直接從內(nèi)存中取出,提交給用戶,以減小系統(tǒng)壓力,提高響應(yīng)速度。例如,把獲得數(shù)據(jù)的RecordSet對(duì)象存放在Application變量中,用戶訪問時(shí),直接從Application變量中獲取RecordSet對(duì)象;也可以將RecordSet對(duì)象數(shù)據(jù)存放在數(shù)組中,然后再將數(shù)組存儲(chǔ)在Application變量中,使用時(shí)用數(shù)組的方式讀取等。

        緩存是典型的以空間換取時(shí)間的做法。如果緩存的內(nèi)容正確,那么可以看到性能會(huì)有顯著的提高。為使緩存有效,必須保存那些經(jīng)常重復(fù)使用的,并且重新計(jì)算需要付出較大代價(jià)的數(shù)據(jù)。如果緩存的都是不常用的數(shù)據(jù),反而會(huì)造成內(nèi)存浪費(fèi)。

        4.2 使用存儲(chǔ)過程

        在站點(diǎn)中,可能存在多次查詢大量信息,用于判斷,然后更新入庫(kù)。這種情況如果在編寫ASP時(shí),直接在一個(gè)程序中多次操作數(shù)據(jù)庫(kù),不僅需要IIS創(chuàng)建很多ADO對(duì)象,加大開銷,而且還會(huì)加重?cái)?shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān),增大網(wǎng)絡(luò)流量。如果把多次數(shù)據(jù)庫(kù)操作流程定義為一個(gè)存儲(chǔ)過程,用如下方式調(diào)用:

        Objcmd.Execute "Exec proceuure_name" , adCmdText

        就可以利用數(shù)據(jù)庫(kù)本身的強(qiáng)大性能,減輕Web服務(wù)器的壓力,而且由于頁(yè)面內(nèi)容與業(yè)務(wù)分開,管理維護(hù)也變得方便。

        4.3 僅選擇所需的字段

        使用ADO記錄集中的數(shù)據(jù)表時(shí),盡量避免自動(dòng)使用表名(即SELECT*),除非想使用其中所有字段中的數(shù)據(jù)。如果只選擇需要的字段,將減少發(fā)送到服務(wù)器或從服務(wù)器取出的數(shù)據(jù)量。即使需要使用全部字段列,單獨(dú)命名每個(gè)字段列也會(huì)獲得最佳的性能,因?yàn)榉?wù)器不必再解釋這些列的名字。

        4.4 使用優(yōu)化過的SQL語(yǔ)句

        在ASP技術(shù)中,ADO對(duì)象會(huì)消耗大量資源,執(zhí)行一個(gè)SQL語(yǔ)句需要很長(zhǎng)時(shí)間,一直占用整個(gè)資源,導(dǎo)致系統(tǒng)不能有足夠的資源為其他用戶服務(wù)。ADO是通用對(duì)象控件,沒有利用數(shù)據(jù)庫(kù)的特性。如果結(jié)合數(shù)據(jù)庫(kù)特性來編寫ASP程序,可以有效地釋放資源。例如,對(duì)于已經(jīng)執(zhí)行過的Sql語(yǔ)句,Oracle數(shù)據(jù)庫(kù)服務(wù)器通常都經(jīng)過了分析優(yōu)化,并存儲(chǔ)在一個(gè)Sql內(nèi)存緩沖區(qū)中,當(dāng)下次接收到同樣的sql語(yǔ)句請(qǐng)求時(shí),直接從內(nèi)存緩沖區(qū)取出執(zhí)行,不再進(jìn)行分析優(yōu)化,從而可以大幅度提高性能。這就要求編寫ASP程序時(shí),盡量使用相同的Sql語(yǔ)句,或者參數(shù)化的Sql語(yǔ)句,比如,不使用在IN語(yǔ)句中包含子查詢的語(yǔ)句,充分利用索引,設(shè)置Command.Prepared屬性預(yù)編譯SQL語(yǔ)句:

        Set cmd=Server.createobject(“adodb.command”)

        cmd.CommandText=”select * from product where productcode=?”

        4.5 需用時(shí)創(chuàng)建,用完即釋放

        ADO對(duì)象是非常消耗資源的,因此,只有在用到ADO對(duì)象時(shí)再創(chuàng)建它,用完后馬上釋放:

        set rs=Server.createobject(“adodb.recordset”)

        ….

        rs.close

        set rs=nothing

        對(duì)數(shù)據(jù)庫(kù)的優(yōu)化處理可以使Web頁(yè)面的瀏覽速度在其它條件不變的情況下得到大大提升,在大型網(wǎng)站中數(shù)據(jù)庫(kù)的優(yōu)化顯得龍為重要。

        參考文獻(xiàn)

        [1]郭瑞軍,李杰,初曉璐.數(shù)據(jù)庫(kù)開發(fā)實(shí)例精粹[M].北京.電子工業(yè)出版社,2005.05.

        [2]頊宇峰,馬軍.ASP網(wǎng)絡(luò)編程從入門到精通[M].北京.清華大學(xué)出版社,2006.07.

        [3]周興華,王敬棟.ASP+Access數(shù)據(jù)庫(kù)開發(fā)與實(shí)例[M].北京.清華大學(xué)出版社,2006.09.

        猜你喜歡
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        国产视频一区二区三区在线看| 日本护士吞精囗交gif| 欧美视频二区欧美影视| 丁香九月综合激情| 久久久人妻一区二区三区蜜桃d | 一本久道高清视频在线观看 | 国产无人区码一码二码三mba| 久久青草免费视频| 黄色三级一区二区三区| 一本色道久久亚洲综合| 久久亚洲精品11p| 久久九九青青国产精品| 中文字幕精品久久一区二区三区| 国产精品午夜福利视频234区 | 久人人爽人人爽人人片av| 久久这里只精品国产免费10| 69堂在线无码视频2020| 亚洲国产免费不卡视频| 国产综合在线观看| 久久久久这里只有精品网| 成人在线视频自拍偷拍| 久草青青91在线播放| 性一交一乱一伦一色一情孩交| 日韩精品成人无码AV片| 久久老熟女一区二区三区| 国产av国片精品jk制服| 久久精品夜夜夜夜夜久久| 蜜桃在线观看免费高清完整版| 人妻少妇猛烈井进入中文字幕| 一本色道久久88综合日韩精品| 亚洲综合伊人制服丝袜美腿 | 国产精品人伦一区二区三| 玩中年熟妇让你爽视频| 欧美一级人与嘼视频免费播放| 五十路一区二区中文字幕| 国产老熟妇精品观看| 最近中文av字幕在线中文| 日本最新一区二区三区视频| 亚洲精品国产一二三区| 色欲av亚洲一区无码少妇| 欧美在线Aⅴ性色|