1 connection
1.1 pooling
在web application中,常常会出现同时有很多用户同时访问数据库的情况,而且asp中的对象作用域是页面级的,也就是说,每个页面都要联接和断开数据库,岂不是会很慢?而且每个到sql server数据库的联接会带来37k的系统开销,怎么办?
可能有人会想到用application和session来解决问题,但是,这是不可取的,如果用application,那么会出现多个用户同时通过一个connection访问数据库的情况,虽然节省了建立连接的时间,但是访问数据库的速度就会变得非常慢。如果用session,出现的问题就是,session超时怎么办?如果把session.timeout设得很大,那用户离开之后,连接还会保留一段时间,也会带来额外的开销。
其实根本不用考虑这个问题,通过ole db访问数据库,它会替你解决这个问题,ole db有一个resource pooling,它会代理你的连接请求,然后把别人刚用过的连接给你接着用。(具体机制不再阐述,其实我也没搞太明白,嘻嘻)
1.2 provider
可能没有多少人用过这个property吧,它的缺省值是msdasql,还有msidxs和adsdsoobject,但是在ado2.0(见vs98)和ado2.1(见sql7)里面提供了一些新的provider:
msdaora (ole db provider for oracle)
microsoft.jet.oledb.3.51(ole db provider for microsoft jet( for access))
sqloledb(microsoft sql server ole db provider)
如果你所用的数据库是这些的话,用这些新的provider就可以不通过odbc而直接访问数据库,提高的效率就可想而知了。
2 command
2.1 commandtype
缺省值是adcmdunknown,ado会逐个判断你的commandtype,直到它认为合适为止,不建议采用。(在recordset.open和connection.execute的时候也可以用)
adcmdtext是照原样执行你的sql语句,但是如果你的sql language是以下几种的话,通过使用别的commandtype就可以提高你的sql语句执行效率
objcmd.execute “select * from table_name”, adcmdtext可替换为objcmd.execute “table_name”,adcmdtable
objcmd.execute “exec proceuure_name”,adcmdtext可替换为objcmd.execute “proceuure _name”, adcmdstoredproc
还有很重要的一点就是,如果你的sql语句没有返回记录集,如insert和update等,那么使用adexecutenorecords(ado2.0)可以减低系统开销(可以加到adcmdtext 和adcmdstoredproc上,如adcmdstoredproc + adexecutenorecords)
还有adcmdtabledirect和adcmdfile(ado2.0),我还不太清楚怎么用,adcmdfile可用于访问一个xml文件。
2.2 prepared
如果你需要重复的执行类似的sql语句,那么你可以预编译你的sql语句,提高的效率也很可观
objcmd.commandtext = “select spell from typer.wordspell where word = ? ”
objcmd.prepared = true
objcmd.parameters.append objcmd.createparameter(“word”, advarchar, , 2)
for i = 1 to len(strname)
strchar = mid(strname, i, 1)
objcmd(“word”) = strchar
set objrs = objcmd.execute
if objrs.eof then
strnamesame = strnamesame & strchar
else
strnamesame = strnamesame & objrs(“spell”)
end if
next ’i = 1 to len(strname)
全面优化ado
3 recordset
3.1 locktype
缺省是adlockreadonly,如果你不用修改数据,就不要改成adlockoptimistic之类的,否则也会减低速度和增加开销的
adlockreadonly > adlockpessimistic > adlockoptimistic > adlockbatchoptimistic
3.2 cursortype
缺省是adopenforwardonly,如果你只用movenext method,也最好不要改,速度影响140%左右
adopenforwardonly > adopendynamic > adopenkeyset > adopenstatic
3.3 cursorlocation
缺省是aduseserver,其实不好,它可以随时反映数据库服务器上的改动,但是系统开销很大,而且需要维持和数据库服务器的连接,但是在数据库服务器和web server在一起的时候要快些。不过在adlockoptimistic的时候使我无法使用recordcount等property。
使用用aduseclient的话,你可以对数据做再排序,筛选,shape等操作
如果对数据的实时性没有要求的话,尽量用aduseclient
4 其它
4.1 early bind
用asp这一点就不用看了,如果用vb的话
dim objconn as adodb.connection 比 set objconn = createobject(“adodb.connection”)要好
4.2 ado 2.1里的shape真是好玩
4.3 ado 2.1可以用objrs.fields.append来建立一个recordset
4.4 把recordset的一列数据直接变成一个数组来操作速度快一些,但是系统开销要大一些