資料存取耗時通常遠超過 ASP 程式碼解譯編譯時間,是效能瓶頸的常見來源。本文聚焦於「建立高效連線」與「快速釋放資源」兩大核心,結合連線池機制,提供實戰優化模式。
ASP 執行模型下,大量並發請求會交錯執行。若連線與 Recordset 物件持有時間過長,會耗盡連線池,導致新請求排隊等待。因此:
GetRows/GetString: 將資料一次讀入陣列/字串,立即關閉連線,後續在記憶體中處理,極大縮短連線佔用時間。<%
rs1.Open strSQL1, cnn1
rs2.Open strSQL2, cnn2
rs3.Open strSQL3, cnn3
' ... 處理 rs1, rs2, rs3 ...
rs1.Close: rs2.Close: rs3.Close
cnn1.Close: cnn2.Close: cnn3.Close
%>
此模式在並發下會佔用多倍連線資源,極易耗盡連線池。
<%
' 共用同一連線物件
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConn
rs1.Open strSQL1, cnn
' 處理 rs1 或 rs1.GetRows()
rs1.Close
rs2.Open strSQL2, cnn
' 處理 rs2
rs2.Close
rs3.Open strSQL3, cnn
' 處理 rs3
rs3.Close
cnn.Close
Set cnn = Nothing
%>
| 方式 | 語法 | 效能 | 說明 |
|---|---|---|---|
| DSN | cnn.Open "DSN=MyDSN" | 較慢 | 需讀取登錄,額外開銷 |
| DSN-less | cnn.Open "Driver={SQL Server};Server=...;Database=...;Uid=...;Pwd=..." | 中等 | 無登錄查找,但連線字串解析有開銷 |
| OLE DB (推薦) | cnn.Open "Provider=SQLOLEDB;Data Source=...;Initial Catalog=...;User ID=...;Password=..." | 最快 | 原生 OLE DB 提供者,路徑最短,支援連線池最佳化 |
' 方式 A:明確建立 Connection(推薦)
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConn
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, cnn
' 方式 B:直接開啟 Recordset(隱性建立連線)
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, strConn
測試顯示方式 A 效能較佳,因可顯式控制連線池行為(如 ConnectionTimeout、CommandTimeout),且利於重複使用同一連線物件執行多條命令。
SQLServer:General Statistics → User ConnectionsProvider=SQLOLEDB)。GetRows()/GetString() → 關閉 Recordset → 關閉 Connection。Option Explicit、錯誤處理、Response.Write SQL 除錯等良好習慣。連線管理是資料存取優化的基石。掌握「短連線、即釋放、共用池」三字訣,配合 OLE DB 與 GetRows,能顯著提升 ASP 應用的並發承載能力。