ado|對象 在真實的生活裡,程式員天生懶惰. 這個事實使我們經常深陷BUG的泥塘. 尤其是當用ASP處理資料庫連接時,它將讓你感覺身處油鍋.
在ASP裡,我們建立資料庫連接,然後用ADO獲得資料查詢的結果; 我們最常用到的是ADODB.Connection和ADODB.Recordset. 讓我們看一個簡單的例子來瞭解一下如何使用這兩個對象:
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "DSN=Northwind"
objConn.Open
Dim objRS
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "SELECT * FROM Table1", objConn
如果你還不是很熟悉資料庫連接的話,請先閱讀這篇文章
(http://www.4guysfromrolla.com/webtech/faq/Databases/faq2.shtml).
我們從objRS開始討論我們的主題. 當我們用完objRS之後會做些甚麽呢? 通常情況下程式員不再進行任何操作,他們讓ASP去料理後事. 當Server.CreateObject調用發生後,伺服器將分配資源來操作這些對象的新執行個體(instances),如果我們不顯式地通知伺服器我們不再使用這些分配的資源了,ASP應該為我們釋放這些資源. 對ASP完全信任有點兒冒險. 更安全和更可信的辦法是顯式地關閉和清除我們的Recordset和
Connection對象的執行個體.
我們該怎麼關閉我們的對象及釋放掉所分配的記憶體呢? 我們所要做的全部事情就是當我們用完這兩個對象後調用以下的四行代碼:
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
這樣將強制釋放資源,遠勝過依賴ASP隱式地自動釋放. 現在,你可能會有些疑惑:我們這麼做真的很重要嗎? 誰會在每個用過資料庫連接的ASP頁面裡多寫四行代碼呢? 這樣做的好處遠遠超過多寫四行代碼給我們帶來的負擔. 讓我們引用
ActiveServerPages.com(http://www.activeserverpages.com/)的站長的一些話:
"你應該關閉Recordset,設為Nothing,關閉Connection,用同樣的次序將其設為
Nothing. 標準的資源片段收集是不完全的和不可信的.[前面提到的片段收
集,Charles指的是隱式地清除伺服器分配的資源.]
"DataReturn[一個ASP webhosting公司]有許多網站依賴IIS自動進行片段收集時出現可怕的錯誤. 在加上Close/Set Nothing的幾行代碼後,這些網站又象馬兒一樣歡快地跑起來. 所有的大站都有顯式釋放資源的硬性規定."
如果Charles的話還不能讓你信服,讓我們來討論一個由於沒有顯式使用記憶體再分配而出現的問題,這是個真實的例子. Brian Fairchild用Access做後台資料庫來支援一個ASP大站. 他發現每過一陣子時間,ASP頁面就會完全停止相應! HTML頁能正常顯示,但所有的ASP頁面完全癱瘓,系統不得不重啟. 最後,Brian發現,顯式地關閉和釋放Recordset和Connection對象,故障就全部消失了. (看看訊息板上Brian談及此故障的文章)(http://www.aspmessageboard.com/forum/performance.asp?
M=1321&P=1&F=23)
Charles Carroll還告訴我們一個技巧,那些用Access的使用者應該增加預設的線程數目. 這兒就是Charles所說的:
"註冊表裡Access預設的線程數是4. 把它加到20將會使伺服器跑得出乎尋常的順暢, 但只是對Access特別管用,我們的伺服器的CPU佔用率從上午8點到晚上5點都是100%,但我在增加了線程數以後,伺服器上的CPU馬上涼快了下來."