top
Loading...
關于數據庫連接的一點淺見
最近經常見到有人問如何連接數據庫效率最高,耗費資源最低,在這里我談一下我的看法。連接數據庫不外乎三種方
法,一種是將數據庫連接放到session變量中,一種是放到application變量中,再一種就是在頁面中使用時打開,用完立
刻關閉。盡管前兩種方法用起來比較方便,但應該說第三種方法是最好的,下面我分別講一下,由于水平所限,錯誤難
免,請大家指正。

session:用session的缺點顯而易見,服務器會為每一個用戶創建一個數據連接,直到這個用戶離開或session超時,
這樣就會大大浪費服務器資源,如果訪問量大的話,系統資源就會被耗盡,或者數據庫連結數到達上界,就會造成程序出
錯。

application:既然用session會出現這么多問題,那是不是用application最節省資源呢?只建立一條連接就夠了,大
家共用。不是這樣的,如果無論多少用戶只建立一條連接,同樣會帶來很多問題,首先是如果訪問量大,一條連接肯定無
法滿足需要,同樣會造成程序出錯;其次,如果你用了私人臨時表或光標,那麻煩就來了。私人臨時表和光標只對當前連
接可見,可是如果大家都用一條連接,那么就會產生沖突,造成程序錯誤。

最后一種方法(即開即用即關):這是最好的一種方法,原因如下:打開數據庫連接,使用完立即關閉,是一種良好的
編程習慣,其實不僅是數據庫連接對象如此,所有對象也就是說server.creatobject出來的對象理論上生存期都不能超過
0.01秒(國外有人做過測試的,不是我信口開河),如果超過就會對效率產生影響。那么也許你會說每個頁面都會打開一個
連接,那打開的連接數不是更多,效率不是更低嗎?錯了,講到這里就不能不提一下連接池(也叫共享池的概念),現在
的大型數據庫包括odbc本身都提供連接池的功能,他的基本原理是這樣的,一個連接申請關閉時系統并不是真的關閉它,
而是將它放到共享池中,如果這時有相同的連接請求,系統就會把這個連接從共享池中取出來給用戶,這樣就省去了關閉
和打開連接的系統開銷,只有當這個連接長時間不被請求時并且共性池中的連接飽和,系統才會真的干掉它。明白這個道
理,你就明白盡管你在程序中請求打開和關閉連接,但系統并不一定要增加這些開銷的。

道理講完了,現在給例子。下面是打開和關閉數據庫連接的兩個函數,你可以把它存為一個include文件,使用時包含
進來就行了。例子連接的數據庫是sql server 7.0,我沒用odbc,因為用oledb效率高的多。

<script language = VBScript runat = server>
'---------------------------------------------------------------------------------
'
' file name : connectdb.inc
'
' Description: 數據庫連接
'
' function list : OpenDbConnection(a_strDataName , a_strServerName) :打開數據庫連接
' parameter: a_strDateName , 數據庫服務器名
' a_strServerName :數據庫server名
'
' CloseDbConnection(a_objDbConn) :關閉數據庫連接
' parameter: a_ObjDbConn ,連接對象
'
'
' date: 2000/05/03
'
' Author: LiuYunpeng
'
' History: 2000/05/03 version 1.0
' 2000/06/03 modified function opendbconnection's parameters
' by LiuYunpeng
'--------------------------------------------------------------------------------


Function OpenDbConnection(a_strDataName , a_strServerName)
dim m_DbConn , m_strConn
Set m_dbConn = Server.CreateObject("ADODB.Connection")
m_strConn = "Provider=Sqloledb ; User ID = sa ; Password= ; Initial Catalog = "&a_strDataName&" ;
Data Source = "&a_strServerName
m_dbConn.open m_strConn
Call CheckError()

'return this database connection
Set OpenDbConnection = m_dbConn
end function

sub CloseDbConnection(a_objDbconn)
a_objDbconn.close
set a_objDbConn = nothing
end sub


</script>

簡單說一下使用方法,假設你的數據庫server是"server1" , 數據庫是"mydatabase" , 則使用如下

<%
dim m_objConn

'打開數據庫連接
set m_objConn = OpenDbConnection("mydatabase" , "server1")
....

'關閉數據庫連接
CloseDbConnection m_objConn
%>

北斗有巢氏 有巢氏北斗