明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

在ASP中優(yōu)化數(shù)據(jù)庫處理

[摘要]來源:中國計算機報  ASP是一個Web服務(wù)器端的開發(fā)環(huán)境,它提供了一種簡單易學的腳本(VBScript或Jscript),并帶有許多內(nèi)置的對象,從而提供了一條簡捷的編程之路。更為重要的是,ASP中提供了ADO對象,讓程序員可以輕松操作各種數(shù)據(jù)庫,從而可以產(chǎn)生和運行動態(tài)的、交互的Web服務(wù)應(yīng)用程序...
來源:中國計算機報

  ASP是一個Web服務(wù)器端的開發(fā)環(huán)境,它提供了一種簡單易學的腳本(VBScript或Jscript),并帶有許多內(nèi)置的對象,從而提供了一條簡捷的編程之路。更為重要的是,ASP中提供了ADO對象,讓程序員可以輕松操作各種數(shù)據(jù)庫,從而可以產(chǎn)生和運行動態(tài)的、交互的Web服務(wù)應(yīng)用程序。

  目前,國內(nèi)很多電子商務(wù)站點都采用了ASP技術(shù)來與數(shù)據(jù)庫交互,為用戶提供各類服務(wù)。

  由于電子商務(wù)站點的大部分信息都存放在數(shù)據(jù)庫中,要提高Web的響應(yīng)速度、建立高性能的電子商務(wù)站點,很大一部分取決于ASP與數(shù)據(jù)庫之間的處理性能,本文將具體介紹一些優(yōu)化數(shù)據(jù)庫處理的方法。


  使用Connection Pool機制


  在數(shù)據(jù)庫處理中,資源花銷最大的是建立數(shù)據(jù)庫連接,而且用戶還會有一個較長的連接等待時間。若每一個用戶訪問時,都重新建立連接,不僅用戶要長時間等待,而且系統(tǒng)有可能會由于資源消耗過大而停止響應(yīng)。如果能夠重用以前建立的數(shù)據(jù)庫連接,而不是每次訪問時都重新建立連接,則可以很好地解決這些問題,從而提高整個系統(tǒng)的性能。在IIS+ASP處理體系中,采用了Connection Pool機制來保證這一點。

  Connection Pool的原理是:IIS+ASP體系中維持了一個連接緩沖池,建立好的數(shù)據(jù)庫連接在ASP程序中的斷開都是邏輯斷開,而實際的物理連接被存儲在池中并被加以維護。這樣,當下一個用戶訪問時,直接從連接緩沖池中取得一個數(shù)據(jù)庫連接,而不需重新連接數(shù)據(jù)庫,因此,可以大大地提高系統(tǒng)的響應(yīng)速度。

  為了正確使用Connection Pool機制,必須注意以下幾點:

  1. 在MDAC2.0以前的版本中,必須經(jīng)過數(shù)據(jù)庫驅(qū)動程序的配置才能使用Connection Pool;在以后的版本中(比如MDAC2.1),缺省是使用Connection Pool機制。具體配置情況可以參見微軟公司的站點(http://www.microsoft.com/data/)。

  順便提一句,在使用Oracle數(shù)據(jù)庫時,最好使用微軟提供的驅(qū)動程序。

  2. 每次數(shù)據(jù)庫連接串參數(shù)必須相同,否則會被認為是不同的連接而重新去連接數(shù)據(jù)庫,而不是使用緩沖池中的連接。最好的做法是將連接串存儲在Application變量中,所有的程序在建立連接時使用Application變量的值。

  3. 為了更好地使用和維護連接緩沖池,建議在程序中使用以下的方法對數(shù)據(jù)庫連接進行操作,因為隱式使用數(shù)據(jù)庫連接時不能利用緩沖池的機制:

  顯式創(chuàng)建連接對象: Set conn=Server.CreateObject(“Adodb.connection”)

  建立數(shù)據(jù)庫連接:conn.open Application(“connection_string”)

  顯式關(guān)閉連接對象:conn.close


  利用直接的OLE DB驅(qū)動程序


  在ASP中,通過ADO可以使用兩種方式連接數(shù)據(jù)庫,一種是傳統(tǒng)的ODBC方式,一種是OLE DB方式。由于ADO是建立在OLE DB技術(shù)上的,為了支持ODBC,必須建立相應(yīng)的OLE DB 到ODBC的調(diào)用轉(zhuǎn)換(如MS OLEDB provider for ODBC)。而使用直接的OLE DB方式(如MS OLEDB provider for SQL, Oracle),則不需轉(zhuǎn)換,從而提高處理速度,同時,還能利用OLE DB的新特性。


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


  通常,在ASP程序中,都會涉及到一些存儲在數(shù)據(jù)庫中的常用信息,如省份列表、商品分類等,這些信息對于每一個訪問用戶都是相同的。若每一個用戶訪問時,都要去數(shù)據(jù)庫里取出來,然后顯示給用戶,不僅會使數(shù)據(jù)庫服務(wù)器負載加重,無法快速服務(wù)于更重要的事務(wù)處理,而且Web服務(wù)器也必須不停地創(chuàng)建ADO對象,從而消耗大量資源,導(dǎo)致了當用戶很多時幾乎失去響應(yīng)。若能把一些常用信息事先存儲在內(nèi)存中,當用戶訪問時,直接從內(nèi)存中取出,顯示給用戶,則可以大大減小系統(tǒng)的壓力,提高響應(yīng)速度。

  比如,我們可以把已經(jīng)取得了數(shù)據(jù)的RecordSet對象存儲在Application變量中,當用戶訪問時,從Application變量中取得RecordSet對象,而不需再次建立數(shù)據(jù)庫連接;也可以將RecordSet對象里的數(shù)據(jù)以其他方式存儲,比如存儲在數(shù)組中,然后再將數(shù)組存儲在Application變量中,使用時用數(shù)組的方式讀取。

  需要注意的是,一個對象要存儲在Application變量中,線程模式必須是Both;對于不滿足該條件的對象,必須以其他方式,比如轉(zhuǎn)換成數(shù)組的方式存儲在Application變量中,這也是上面所說的將內(nèi)容存儲在數(shù)組中的原因。


  使用數(shù)字序列


  在ASP程序中,從諸如RecordSet中讀取數(shù)據(jù)時,為了方便,常使用數(shù)據(jù)庫列名的方式進行:

  Response.write rs(“fieldnameN”)

  而很少采用該數(shù)據(jù)庫列名所在的數(shù)字序列來讀取,即:

  Response.write rs(N)

  其實,為了從RecordSet得到列值,ADO必須將列名轉(zhuǎn)化為數(shù)字序列,因此,若直接使用數(shù)字序列,則可以提高讀取速度。若感覺使用數(shù)字序列后,程序可讀性不直觀,可以采用建立常量的方法,如定義:

  const FIELDNAME1 1

  這樣就保證了程序的可讀性和讀取速度。


  使用數(shù)據(jù)庫過程


  在電子商務(wù)站點中,尤其是要進行交易的站點,為了完成交易,可能需要多次查詢大量的信息,用于判定是非,然后更新入庫。若在編寫ASP時,直接在一個程序中作多次數(shù)據(jù)庫操作,不僅IIS要創(chuàng)建很多的ADO對象,消耗大量資源,而且加重了數(shù)據(jù)庫服務(wù)器的負擔,增大了網(wǎng)絡(luò)流量。若把多次數(shù)據(jù)庫操作流程定義為一個數(shù)據(jù)庫過程,用如下方式調(diào)用:

  connection.execute “{call procedurename(..)}”

  這樣可以利用數(shù)據(jù)庫的強大性能,大大減輕Web系統(tǒng)的壓力,而且由于頁面內(nèi)容與業(yè)務(wù)分開,管理維護也變得方便。


  利用數(shù)據(jù)庫的特性


  ADO是一套通用的對象控件,本身沒有利用數(shù)據(jù)庫的任何特性。但若在ASP程序編寫時,有意識地考慮結(jié)合數(shù)據(jù)庫的特性,往往可以有很好的效果。

  比如,Oracle數(shù)據(jù)庫服務(wù)器對于執(zhí)行過的SQL語句,通常都經(jīng)過了分析優(yōu)化,并存儲在一個SQL內(nèi)存緩沖區(qū)中,當下次同樣的SQL語句請求時,直接從內(nèi)存緩沖區(qū)取出執(zhí)行,不再進行分析優(yōu)化,從而可以大幅度提高性能。這就要求在ASP程序編寫時,盡量使用相同的SQL語句,或者參數(shù)化的SQL語句:

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

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


  用時創(chuàng)建用完釋放


  在前面也提到過,ADO對象是非常消耗資源的,因此一定要牢牢記住,只在用到ADO對象時才創(chuàng)建,用完后馬上釋放,程序如下:

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

  ….

  rs.close

  set rs=nothing


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


  對于電子商務(wù)網(wǎng)站,最主要的就是要保證不論訪問用戶的多少,系統(tǒng)都要有足夠快的響應(yīng)速度。由于在ASP技術(shù)中,ADO對象消耗的資源是非常大的,若一個SQL語句要執(zhí)行很長的一段時間,對整個資源也將一直占用,使系統(tǒng)沒有足夠的資源服務(wù)于其它用戶。因此,盡量使用優(yōu)化過的SQL語句,減少執(zhí)行時間。比如,不使用在in語句中包含子查詢的語句,充分利用索引。

  只要在我們的電子商務(wù)網(wǎng)站的建設(shè)中充分考慮到效率問題,并利用上述介紹的解決方法,會極大地提高網(wǎng)站的響應(yīng)速度。