首页 > 开发 > 综合 > 正文

全面优化ADO

2024-07-21 02:08:35
字体:
来源:转载
供稿:网友
  • 网站运营seo文章大全
  • 提供全面的站长运营经验及seo技术!
  • 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)
    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的一列数据直接变成一个数组来操作速度快一些,但是系统开销要大一些

    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表