全面优化ADO         kinmax(转贴)    
       
  关键字           ADO    
       
  出处           http://www_aspsky_net.htm/    
       
   
  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的一列数据直接变成一个数组来操作速度快一些,但是系统开销要大一些 
posted on 2007-06-27 16:56  .NET初学者俱乐部  阅读(211)  评论(0)    收藏  举报


 
Asp.net 初学者零起点从入门到精通