关于数据库连接的一点个人见解

---摘自《ChinaASP网络》（文/bigeagle）
最近经常见到有人问如何连接数据库效率最高，耗费资源最低，在这里我谈一下我的看法。连接数据库不外乎三种方法，一种是将数据库连接放到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
%>