如果一个数据库里有非常多的数据,那么我们用常规的方法来读取数据库的时候就会非常非常的慢,为什么常规的方法会非常慢呢?因为常规的方法是设定好记录集的分页属性,然后读取数据,而每次读取数据都是把所有的数据读了出来,然后再根据设定好的分页属性进行筛选,这样,如果总的数据量少了不明显,而当数据量非常庞大时,当然就会非常明显的感觉到慢了。
今天给大家介绍的是asp从数据库快速提取数据并存储到缓存的方法,首先我们知道,既然我们事先已经设定好了每页要显示的数据量,并且能够控制要显示的第几页,那么我们就可以根据这俩个参数来读取数据库里起始记录的"ID"值,然后根据这个ID值来读取所需要的数据。
不说废话了,省得大家看得头疼,直接上代码:
<% Dim PageNo Dim TblName,FldName,FieldName,PageSizeX,OrderType,StrWhere Dim TopField,StrTmp,StrTmpt,StrOrder,SqlString PageNo=trim(Request.Querystring("PageNo"))'显示的页数 TblName = "Answer_ASK_Member" '数据表名称 FldName = "id" '排序字段 建议是主键,值里不能有重复值 FieldName="id,Qid,Answer_Con,Answer_Time,Answer_IP,MemberName,ASKHtml" '要显示的字段 PageSizeX=4 '每页显示的数据 OrderType=1 '0-为降序 1-升序 StrWhere="" '检索数据的条件 如StrWhere=" (Code='0101') and (Hits>100) " Call ConnData() '连接数据库 Call GetDataSqlstr(DataConn) '获取要读取数据的SQL语句 rs.open sqlstring,conn,1,1 while not rs.eof ..... rs.movenext wend rs.close %>
上面的代码中,用到了俩个自定义的函数,一个是连接数据库的函数ConnData(),这个大家应该都知道怎么写,另一个是关键和重点,就是获取要读取数据库时用到的SQL语句的函数:GetDataSqlstr(),先来看这个函数的具体内容:
<% Function GetDataSqlstr(Conn) if isnumeric(PageNo) or PageNo="" then PageNo=abs(PageNo) if PageNo=0 then PageNo=1 end if else PageNo=1 end if TopField=(PageNo-1)*PageSizeX 'TOP多少条 if OrderType=0 then StrTmp = "<" StrTmpt="min" StrOrder = " Order BY ["&FldName&"] desc" else StrTmp = ">" StrTmpt="max" StrOrder = " Order BY ["&FldName&"] asc" end if '定义sql语句 SqlString="Select Top "&Clng(PageSizeX)&" "& FieldName &" From "&TblName&" " if PageNo=1 then '如果是第一页时,执行如下代码查库速度快 if trim(StrWhere)<>"" then SqlString=SqlString&" Where "&StrWhere & StrOrder&"" else SqlString=SqlString & StrOrder end if else Dim StartID if trim(StrWhere)<>"" then SqlString="select "&StrTmpt&"("&FldName&") from(select top "&Clng(TopField)&" "&FldName&" from "&TblName&" where "&StrWhere&StrOrder&") as angel_rs" StartID=GetSqlReturn(TblName,SqlString,Conn,0) SqlString="select top "&PageSizeX&" "&FieldName&" from "&TblName&" where "&FldName&""&StrTmp&""&StartID&" where "&StrWhere&StrOrder else SqlString="select "&StrTmpt&"("&FldName&") from(select top "&Clng(TopField)&" "&FldName&" from "&TblName&StrOrder&") as angel_rs" StartID=GetSqlReturn(TblName,SqlString,Conn,0) SqlString="select top "&PageSizeX&" "&FieldName&" from "&TblName&" where "&FldName&""&StrTmp&""&StartID&StrOrder end if end if End Function %>
上面的函数中,还用到了一个自定义的函数,GetSqlReturn,这个函数的作用是把指定SQL语句的运行结果保存在数据缓存里,这样当有同样的请求时就可以直接从缓存里读取,来看这个函数的具体内容:
<% Function GetSqlReturn(TableName,SqlString,angelconn,t) '如果表Application(TableName)的值为空,则为其设定一个初始值 If asp_isnull(Application(TableName)) Then Application.Lock Application(TableName)=now() Application.unLock End If GetSqlReturn=GetAppValue(SqlString,t) '如果为0,有值就返回,无值则返回Null,如果t不为0,那么即使读到了值,但如果生成这个值的时候超过了给定的t,也会返回null '如果GetSqlReturn为空,那么就表示1没有缓存过这个值,2,这个值已经过期了,需要重新缓存该值 If asp_isnull(GetSqlReturn) Then GetSqlReturn=angelconn.execute(SqlString)(0) Call ClearAppValue(LCase(SqlString)) Call SetAppValue(SqlString,GetSqlReturn) Else if t=0 then '如果t为0,则表示需要及时读取准确的数据,所以即使取到了值,也要进行时间上的判断 if datediff("s",Application(TableName),Application(SqlString&"_time"))<0 then GetSqlReturn=angelconn.execute(SqlString)(0) Call ClearAppValue(LCase(SqlString)) Call SetAppValue(SqlString,GetSqlReturn) end if end if End If End Function %>
上面这个函数里又出现了三个新的函数,这三个函数其实算是ASP里数据缓存的基础函数了:
<% '设置application Sub SetAppValue(ByVal name, ByVal value) name = LCase(name) Application.Lock Application(name &"_time")=Now() Application(name) = value Application.unLock End Sub '根据设置的更新时间读取application Function GetAppValue(ByVal name, ByVal MinuteTimeout) name = LCase(name) GetAppValue=Application(name) if asp_isnull(GetAppValue) then GetAppValue=Null elseif MinuteTimeout>0 and DateDiff("s",CDate(Application(name &"_time")),Now()) > (60*MinuteTimeout) then GetAppValue=Null Call ClearAppValue(name) end if End Function '清空指定的Application Sub ClearAppValue(Name) Application.Lock Application.Contents.Remove(Name & "_time") Application.Contents.Remove(Name) Application.unLock End Sub %>
如果不想看上面的具体源码,可以点下面的链接直接下载源码。
声明:如需转载,请注明来源于www.webym.net并保留原文链接:http://www.webym.net/jiaocheng/520.html