程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 數據訪問-與數據庫建立連接

數據訪問-與數據庫建立連接

編輯:關於SqlServer
 在第一部分,我們討論了如何優化 ASP 代碼。在這一部分,我們把重點放在數據訪問上。

一般情況下,數據訪問時間要比 ASP 代碼解釋,編譯時間長,不要讓數據檢索成為影響 ASP 性能的瓶頸。

首先,講一些老生常談的話。比如:需要聲明變量,要用 Response.Write SQL_string 來進行調試,要用 On Error Resume
Next 來捕獲錯誤。不要在 Application 和 Session 中存儲 Connection 對象等等,都是一些很多人知道而又不屑一顧的常
識。

提高數據訪問速度包含兩方面內容:1 與數據庫建立連接。2 檢索數據。

建立高效的連接是優化數據庫訪問的第一步。你需要了解連接池的概念( 參見文章: 連接池(Connection Pooling)介紹 );了解
連接數據庫的方法。另外,測試是很重要的,如果你想親自進行測試,可以下載上一部分提到的 WAST ,它可以模擬大量用戶同時
點擊的情況。在這裡,假設你使用的數據庫是 MS SQL Server 7.0 ,如果 操作系統是 NT ,那麼你可以在性能監視器中監測
SQL7 的用戶連接數(counter:User Connections);如果操作系統是98的話,可以使用 SQL7 的 Profiler。

下面,開始討論如何與數據庫建立連接,以及連接池的問題。

1. 使用 OLEDB

與數據庫建立連接有三種方法:DSN,DSN-less,OLEDB( 參見文章: 用ADO連接數據庫的三種方法 )。建議使用 OLEDB。

2. 盡快釋放數據庫對象

假設有 page1.asp 和 page2.ASP,在多人同時點擊的情況下,服務器可能會這樣工作:

第一個人:page1.ASP 的1-5行,
第二個人:page1.ASP 的1-5行,
第一個人:page1.ASP 的6-20行,
第二個人:page1.ASP 的1-5行,
第三個人:page1.ASP 的1-5行,
第四個人:page1.ASP 的1-5行,
第二個人:page1.ASP 的6-20行,
第一個人:page2.ASP 的1-5行,
......

設想一下:有幾千人同時訪問你的主頁,那麼,服務器就會執行數千行,數萬行語句後才回到第一個人請求的頁面上。因此,我們
應盡可能快的處理某個功能,某個任務。看下列代碼:

<%
rs1.Open strSQL1,cnn1 'cnn1 is connection object
rs2.Open strSQL2,cnn2
rs3.Open strSQL3,cnn3
......
'處理 rs1
'處理 rs2
'處理 rs3
......
rs1.Close
rs2.Close
rs3.Close
cnn1.Close
cnn2.Close
cnn3.Close
%>

這種處理結果集的方法會占用比你想象要多的資源,正確的用法應為:

<%
rs1.Open strSQL1,cnn 'cnn is connection object
'處理 rs1
rs1.Close
cnn1.Close
......
rs2.Open strSQL2,cnn
'處理 rs2
rs2.Close
cnn2.Close
......
rs3.Open strSQL3,cnn
'處理 rs3
rs3.Close
cnn3.Close

......
%>

或許你會說:在 rs2 的處理中,我還需要 rs1 的值,所以不能在處理 rs2 前關閉 rs1。那麼解決這個問題更好的辦法是采用
GetRows 和 GetString,在後面會有詳細的說明。

盡快的釋放對象是保證數據庫連接重用的前提。

( 參見文章: 讓數據庫的連接更有效 )

3. 創建 Connection 對象,充分利用連接池。

看下列代碼:

'創建 Connection Object,打開 RecordSet
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConnection
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open strSQL,cnn

'直接打開 RecordSet
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.open strSQL,strConnection

在 asptoday 的 Enhancing Performance in ASP - Part 2 中對這兩種方法進行了測試,結果表明直接打開 RecordSet 比創
建 Connection 快23%(快在頁面處理上,檢索數據庫的速度是一樣的。)所以,這篇文章的結論是:When working with a
single Recordset,pass the connection string into the ActiveConenction property.

我對此有異議:快的代碼不一定是好的代碼。

首先要說明的是,直接打開 RecordSet 的方法依然要創建與數據庫的連接,只不過是由 ADO 自動完成的。其次,這個
Connection 只有在該頁面處理完後才能被釋放(不管是 Recordset.Close 還是 Set recordset = Nothing 都不能做到釋放該
對象)。

Dim rs
Dim strcnn
strcnn = "Driver={SQL Server};Server=.;Database=pubs;UID=sa;PWD=;OLE DB Services=-1;"
For i = 1 To 20
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM Authors",strcnn
rs.Close
Set rs = Nothing
Next


運行上面的代碼,在性能監視器中你會發現數據庫的連接被創建了20個!

Dim cnn,rs
strcnn = "Driver={SQL Server};Server=.;Database=pubs;" &_
"UID=sa;PWD=;OLE DB Services=-1;"
For i = 1 To 20
Set cnn = Server.CreateObject("ADODB.Connectio


您正在看的SQLserver教程是:數據訪問-與數據庫建立連接。n")
cnn.Open strcnn
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM Authors",cnn
rs.Close
Set rs = Nothing
cnn.Close
Set cnn = Nothing
Next

采用上面的代碼,連接數只需要2個!(只為說明問題,不考慮速度)

還有一點要說明的是:服務器處理 ASP 時不是一次只處理一個,也不是一次就把整個頁面處理完,沒有關閉的連接只會占用更多
的資源。所以,盡快的釋放 Connection ,使它回到連接池中才是良好的編程習慣。連接池是服務器共享的資源,它不屬於某個
ASP,也不屬於某個 Session,或者某個 Application。

WAST 是我常用的測試工具,但是測試是一種手段,代替不了實際。如果你對 WAST 的工作方式感興趣,可以到它的主頁去看看。
http://webtool.rte.microsoft.com/

4. 為多個 RecordSet創建一個 Connection 對象

Dim cnn,rs1,rs2,

r3
strcnn = "Driver={SQL Server};Server=.;Database=pubs;UID=sa;PWD=;OLE DB Services=-1;"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strcnn
Set rs1 = Server.CreateObject("ADODB.Recordset")
rs1.Open "SELECT * FROM Authors1",cnn
Set rs2 = Server.CreateObject("ADODB.Recordset")
rs2.Open "SELECT * FROM Authors2",cnn
Set rs3 = Server.CreateObject("ADODB.Recordset")
rs3.Open "SELECT * FROM Authors3",cnn
.....

道理很簡單,這種做法不需要為每一個 RecordSet 創建一個連接,只要傳遞一個引用就夠了。

5. 與多個數據庫連接的問題。

在大部份應用中,我們只對一個數據庫進行操作,但有時也會碰到與多個數據庫連接的情況。下面我們討論兩種連接方式:

'第一種:兩個 Connection,兩個 RecordSet。
Set cnn1 = Server.CreateObject("ADODB.Connection")
Set cnn2 = Server.CreateObject("ADODB.Connection")
cnn1.Open "provider=sqloledb;data source=210.75.56.37;initial catalog=pubs;user
id=coolbel;passWord=coolbel.com;"
cnn2.Open "provider=sqloledb;data source=210.75.56.37;initial catalog=coolbel;user
id=coolbel;passWord=coolbelcom;"
Set rs1 = Server.CreateObject("ADODB.RecordSet")
Set rs2 = Server.CreateObject("ADODB.RecordSet")
rs1.Open "select * from authors",cnn1
rs2.Open "select * from mytable",cnn2
......

'第二種:一個 Connection,兩個 RecordSet。
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open "provider=sqloledb;data source=210.75.56.37;user id=coolbel;passWord=coolbel.com;"
Set rs1 = Server.CreateObject("ADODB.RecordSet")
Set rs2 = Server.CreateObject("ADODB.RecordSet")
rs1.Open "select * from pubs..authors",cnn
rs2.Open "select * from coolbel..mytable",cnn
......


第二種方法極不可取,不僅速度低,而且浪費資源。其效率低下的根本原因在於這種連接方式沒有利用連接池,使得每一次請求都
要重新創建與數據庫的連接。

Click!測試第一種代碼 Click!測試第二種代碼 ( coolbel 不穩定,需要多測試幾遍。)

6. 對於 Disconnected RecordSet,不要忘記使 ActiveConnection = Nothing

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved