在ASP中優(yōu)化數(shù)據(jù)庫處理
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
asp是一個(gè)web服務(wù)器端的開發(fā)環(huán)境,它提供了一種簡(jiǎn)單易學(xué)的腳本(vbscript或jscript),并帶有許多內(nèi)置的對(duì)象,從而提供了一條簡(jiǎn)捷的編程之路。更為重要的是,asp中提供了ado對(duì)象,讓程序員可以輕松操作各種數(shù)據(jù)庫,從而可以產(chǎn)生和運(yùn)行動(dòng)態(tài)的、交互的web服務(wù)應(yīng)用程序。目前,國內(nèi)很多電子商務(wù)站點(diǎn)都采用了asp技術(shù)來與數(shù)據(jù)庫交互,為用戶提供各類服務(wù)。 [br]由于電子商務(wù)站點(diǎn)的大部分信息都存放在數(shù)據(jù)庫中,要提高web的響應(yīng)速度,建立高性能的電子商務(wù)站點(diǎn),很大一部分取決于asp與數(shù)據(jù)庫之間的處理性能。因此,在asp編寫時(shí),要注意數(shù)據(jù)庫處理方法。 [br]1、 使用connection pool機(jī)制 [br]在數(shù)據(jù)庫處理中,資源花銷最大的是建立數(shù)據(jù)庫連接,而且用戶還會(huì)有一個(gè)較長(zhǎng)的連接等待時(shí)間。若每一個(gè)用戶訪問時(shí),都重新建立連接,不僅用戶要長(zhǎng)時(shí)間等待,而且系統(tǒng)有可能會(huì)由于資源消耗過大而停止響應(yīng)。如果能夠重用以前建立的數(shù)據(jù)庫連接,而不是每次訪問時(shí)都重新建立連接,則可以很好地解決這些問題,從而提高整個(gè)系統(tǒng)的性能。在iis+asp處理體系中,采用了connection pool機(jī)制來保證這一點(diǎn)。 [br]connection pool的原理是,iis+asp體系中維持了一個(gè)連接緩沖池,建立好的數(shù)據(jù)庫連接在asp程序中的斷開都是邏輯斷開,而實(shí)際的物理連接被存儲(chǔ)在池中并被維護(hù)。這樣,當(dāng)下一個(gè)用戶訪問時(shí),直接從連接緩沖池中取得一個(gè)數(shù)據(jù)庫連接,而不需重新連接數(shù)據(jù)庫,因此,可以大大地提高系統(tǒng)的響應(yīng)速度。 [br]為了正確使用connection pool時(shí),必須注意以下幾點(diǎn): [br]a). 在mdac2.0以前的版本中,必須經(jīng)過數(shù)據(jù)庫驅(qū)動(dòng)程序的配置才能使用connection pool;在以后的版本中(比如mdac2.1),缺省是使用connection pool機(jī)制。具體配置情況可以參見微軟公司的站點(diǎn)([url=http://microsoft.com/data/]http://microsoft.com/data/[/url])。 [br]順便提一句,在使用oracle數(shù)據(jù)庫時(shí),最好使用微軟提供的驅(qū)動(dòng)程序。 [br]b). 每次數(shù)據(jù)庫連接串參數(shù)必須相同,否則會(huì)被認(rèn)為是不同的連接而重新去連接數(shù)據(jù)庫,而不是使用緩沖池中的連接。最好的做法是將連接串存儲(chǔ)在application變量中,所有的程序在建立連接時(shí)使用application變量的值。 [br]c). 為了更好地使用和維護(hù)連接緩沖池,建議在程序中使用以下的方法對(duì)數(shù)據(jù)庫連接進(jìn)行操作,因?yàn)殡[式使用數(shù)據(jù)庫連接時(shí)不能利用緩沖池的機(jī)制: [br]¨ 顯示地創(chuàng)建連接對(duì)象: set conn=server.createobject(“adodb.connection”) [br]¨ 建立數(shù)據(jù)庫連接:conn.open application(“connection_string”),… [br]¨ 進(jìn)行數(shù)據(jù)庫操作:… [br]¨ 顯式地關(guān)閉連接對(duì)象:conn.close [br][br]2、 利用直接的ole db驅(qū)動(dòng)程序 [br]在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)換,從而提高處理速度,同時(shí),還能利用ole db的新特性。 [br][br]3、 在內(nèi)存中緩存ado對(duì)象或其內(nèi)容 [br]通常,在asp程序中,都會(huì)涉及到一些存儲(chǔ)在數(shù)據(jù)庫中的常用信息,如省份列表,商品分類等,這些信息對(duì)于每一個(gè)訪問用戶都是相同的。若每一個(gè)用戶訪問時(shí),都要去數(shù)據(jù)庫里取出來,然后顯示給用戶,不僅會(huì)使數(shù)據(jù)庫服務(wù)器負(fù)載加重,無法快速服務(wù)于更重要的事務(wù)處理,而且web服務(wù)器也必須不停地創(chuàng)建ado對(duì)象,消耗大量資源,導(dǎo)致了當(dāng)用戶很多時(shí)幾乎失去響應(yīng)。若能把一些常用信息事先存儲(chǔ)在內(nèi)存中,當(dāng)用戶訪問時(shí),直接從內(nèi)存中取出,顯示給用戶,則可以大大減小系統(tǒng)的壓力,提高響應(yīng)速度。 [br]比如,我們可以把已經(jīng)取得了數(shù)據(jù)的recordset對(duì)象存儲(chǔ)在application變量中,當(dāng)用戶訪問時(shí),從application變量中取得recordset對(duì)象,而不需再次建立數(shù)據(jù)庫連接;也可以將recordset對(duì)象里的數(shù)據(jù)以其他方式存儲(chǔ),比如存儲(chǔ)在數(shù)組中,然后再將數(shù)組存儲(chǔ)在application變量中,使用時(shí)用數(shù)組的方式讀取。 [br]需要注意的是,一個(gè)對(duì)象要存儲(chǔ)在application變量中,線程模式必須是both;對(duì)于不滿足該條件的對(duì)象,必須以其他方式,比如轉(zhuǎn)換成數(shù)組的方式存儲(chǔ)在application變量中,這也是上面所說的將內(nèi)容存儲(chǔ)在數(shù)組中的原因。 [br][br]4、 使用數(shù)字序列 [br]在asp程序中,從諸如recordset中讀取數(shù)據(jù)時(shí),為了方便,常使用數(shù)據(jù)庫列名的方式進(jìn)行: [br]response.write rs(“fieldnamen”) [br]而很少采用該數(shù)據(jù)庫列名所在的數(shù)字序列來讀取,即: [br]response.write rs(n) [br]其實(shí),為了從recordset得到列值,ado必須將列名轉(zhuǎn)化為數(shù)字序列,因此,若直接使用數(shù)字序列,則可以提高讀取速度。若感覺使用數(shù)字序列,程序可讀性不直觀,可以采用建立常量的方法,定義: [br]const fieldname1 1 [br][br]5、 使用數(shù)據(jù)庫過程(procedure) [br]在電子商務(wù)站點(diǎn)中,尤其是要進(jìn)行交易的站點(diǎn),為了完成交易,可能需要多次查詢大量的信息,用于判定是非,然后更新入庫。若在編寫asp時(shí),直接在一個(gè)程序中作多次數(shù)據(jù)庫操作,不僅iis要?jiǎng)?chuàng)建很多ado對(duì)象,消耗資源,而且加重了數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),增大了網(wǎng)絡(luò)流量。若把多次數(shù)據(jù)庫操作流程定義為一個(gè)數(shù)據(jù)庫過程,用如下方式調(diào)用: [br]connection.execute “{call procedurename(..)}” [br]則可以利用數(shù)據(jù)庫的強(qiáng)大性能,大大減輕web系統(tǒng)的壓力,而且由于頁面內(nèi)容與業(yè)務(wù)分開,管理維護(hù)也變得方便。 [br][br]6、 使用優(yōu)化過的sql語句 [br]對(duì)于電子商務(wù)網(wǎng)站,最主要的就是要保證,不論訪問用戶的多少,系統(tǒng)都要有足夠快的響應(yīng)速度。由于在asp技術(shù)中,ado對(duì)象消耗的資源是非常大的,若一個(gè)sql語句要執(zhí)行很長(zhǎng)的一段時(shí)間,對(duì)整個(gè)資源也將一直占用,使系統(tǒng)沒有足夠的資源服務(wù)于其它用戶。因此,盡量使用優(yōu)化過的sql語句,減少執(zhí)行時(shí)間。比如,不使用在in語句中包含子查詢的語句,充分利用索引。 [br][br]7、 利用數(shù)據(jù)庫的特性 [br]ado是一套通用的對(duì)象控件,本身沒有利用數(shù)據(jù)庫的任何特性。但若在asp程序編寫時(shí),有意識(shí)地考慮結(jié)合數(shù)據(jù)庫的特性,往往可以有很好的效果。 [br]比如,oracle數(shù)據(jù)庫服務(wù)器對(duì)于執(zhí)行過的sql語句,通常都經(jīng)過了分析優(yōu)化,并存儲(chǔ)在一個(gè)sql內(nèi)存緩沖區(qū)中,當(dāng)下次同樣的sql語句請(qǐng)求時(shí),直接從內(nèi)存緩沖區(qū)取出執(zhí)行,不再進(jìn)行分析優(yōu)化,從而可以大幅度提高性能。這就要求在asp程序編寫時(shí),盡量使用相同的sql語句,或者參數(shù)化的sql語句: [br]set cmd=server.createobject(“adodb.command”) [br]cmd.commandtext=”select * from product where productcode=?” [br][br]8、 用時(shí)創(chuàng)建,用完釋放 [br]在前面也提到過,ado對(duì)象是非常消耗資源的,因此一定要牢牢記住,只在用到ado對(duì)象時(shí)才創(chuàng)建,用完后馬上釋放: [br]set rs=server.createobject(“adodb.recordset”) [br]…. [br]rs.close [br]set rs=nothing
該文章在 2010/7/3 13:25:04 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |