在ASP中最佳化資料庫處理

來源:互聯網
上載者:User
資料|資料庫|最佳化


ASP是一個Web伺服器端的開發環境,它提供了一種簡單易學的指令碼(VBScript或Jscript),並帶有許多內建的對象,從而提供了一條簡捷的編程之路。更為重要的是,ASP中提供了ADO對象,讓程式員可以輕鬆操作各種資料庫,從而可以產生和運行動態、互動的Web服務應用程式。

目前,國內很多電子商務網站都採用了ASP技術來與資料庫互動,為使用者提供各類服務。

由於電子商務網站的大部分資訊都存放在資料庫中,要提高Web的響應速度、建立高效能的電子商務網站,很大一部分取決於ASP與資料庫之間的處理效能,本文將具體介紹一些最佳化資料庫處理的方法。

使用ConnectionPool機制

在資料庫處理中,資源花銷最大的是建立資料庫連接,而且使用者還會有一個較長的串連等待時間。若每一個使用者訪問時,都重建立立串連,不僅使用者要長時間等待,而且系統有可能會由於資源消耗過大而停止回應。如果能夠重用以前建立的資料庫連接,而不是每次訪問時都重建立立串連,則可以很好地解決這些問題,從而提高整個系統的效能。在IIS+ASP處理體系中,採用了ConnectionPool機制來保證這一點。
 

ConnectionPool的原理是:IIS+ASP體系中維持了一個串連緩衝池,建立好的資料庫連接在ASP程式中的斷開都是邏輯斷開,而實際的物理串連被儲存在池中並被加以維護。這樣,當下一個使用者訪問時,直接從串連緩衝池中取得一個資料庫連接,而不需重新串連資料庫,因此,可以大大地提高系統的響應速度。
 

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

1.在MDAC2.0以前的版本中,必須經過資料庫驅動程式的配置才能使用ConnectionPool;在以後的版本中(比如MDAC2.1),預設是使用ConnectionPool機制。具體配置情況可以參見微軟公司的網站(http://www.microsoft.com/data/)。
 

順便提一句,在使用Oracle資料庫時,最好使用微軟提供的驅動程式。

2.每次資料庫連接串參數必須相同,否則會被認為是不同的串連而重新去串連資料庫,而不是使用緩衝池中的串連。最好的做法是將串連串儲存在Application變數中,所有的程式在建立串連時使用Application變數的值。
 

3.為了更好地使用和維護串連緩衝池,建議在程式中使用以下的方法對資料庫連接進行操作,因為隱式使用資料庫連接時不能利用緩衝池的機制:
 

顯式建立連線物件: Set conn=Server.CreateObject(“Adodb.connection”)
建立資料庫連接:conn.open Application(“connection_string”)
顯式關閉連線物件:conn.close

利用直接的OLE DB驅動程式
在ASP中,通過ADO可以使用兩種方式串連資料庫,一種是傳統的ODBC方式,一種是OLE DB方式。由於ADO是建立在OLEDB技術上的,為了支援ODBC,必須建立相應的OLE DB 到ODBC的調用轉換(如MS OLEDB provider for ODBC)。而使用直接的OLEDB方式(如MS OLEDB provider for SQL,Oracle),則不需轉換,從而提高處理速度,同時,還能利用OLE DB的新特性。
 

在記憶體中緩衝ADO對象或其內容
通常,在ASP程式中,都會涉及到一些儲存在資料庫中的常用資訊,如省份列表、商品分類等,這些資訊對於每一個訪問使用者都是相同的。若每一個使用者訪問時,都要去資料庫裡取出來,然後顯示給使用者,不僅會使資料庫伺服器負載加重,無法快速服務於更重要的交易處理,而且Web伺服器也必須不停地建立ADO對象,從而消耗大量資源,導致了當使用者很多時幾乎失去響應。若能把一些常用資訊事先儲存在記憶體中,當使用者訪問時,直接從記憶體中取出,顯示給使用者,則可以大大減小系統的壓力,提高響應速度。

比如,我們可以把已經取得了資料的RecordSetObject Storage Service在Application變數中,當使用者訪問時,從Application變數中取得RecordSet對象,而不需再次建立資料庫連接;也可以將RecordSet對象裡的資料以其他方式儲存,比如儲存在數組中,然後再將數組儲存在Application變數中,使用時用數組的方式讀取。

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

使用數字序列
在ASP程式中,從諸如RecordSet中讀取資料時,為了方便,常使用資料庫列名的方式進行: Response.write rs(“fieldnameN”)

而很少採用該資料庫列名所在的數字序列來讀取,即:

 

Response.write rs(N)

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

 

const FIELDNAME1 1

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

使用資料庫過程
在電子商務網站中,尤其是要進行交易的網站,為了完成交易,可能需要多次查詢大量的資訊,用於判定是非,然後更新入庫。若在編寫ASP時,直接在一個程式中作多次資料庫操作,不僅IIS要建立很多的ADO對象,消耗大量資源,而且加重了資料庫伺服器的負擔,增大了網路流量。若把多次資料庫操作流程定義為一個資料庫過程,用如下方式調用:

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

這樣可以利用資料庫的強大效能,大大減輕Web系統的壓力,而且由於頁面內容與業務分開,管理維護也變得方便。

利用資料庫的特性
ADO是一套通用的對象控制項,本身沒有利用資料庫的任何特性。但若在ASP程式編寫時,有意識地考慮結合資料庫的特性,往往可以有很好的效果。

比如,Oracle資料庫伺服器對於執行過的SQL語句,通常都經過了分析最佳化,並儲存在一個SQL記憶體緩衝區中,當下次同樣的SQL語句請求時,直接從記憶體緩衝區取出執行,不再進行分析最佳化,從而可以大幅度提高效能。這就要求在ASP程式編寫時,盡量使用相同的SQL語句,或者參數化的SQL語句:

 

Set cmd=Server.createobject(“adodb.command”)
cmd.CommandText=”select * from product where productcode=?”

用時建立用完釋放
在前面也提到過,ADO對象是非常消耗資源的,因此一定要牢牢記住,只在用到ADO對象時才建立,用完後馬上釋放,程式如下:

 

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

使用最佳化過的SQL語句
對於電子商務網站,最主要的就是要保證不論訪問使用者的多少,系統都要有足夠快的響應速度。由於在ASP技術中,ADO對象消耗的資源是非常大的,若一個SQL語句要執行很長的一段時間,對整個資源也將一直佔用,使系統沒有足夠的資源服務於其它使用者。因此,盡量使用最佳化過的SQL語句,減少執行時間。比如,不使用在in語句中包含子查詢的語句,充分利用索引。

只要在我們的電子商務網站的建設中充分考慮到效率問題,並利用上述介紹的解決方案,會極大地提高網站的響應速度。




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.