现在的位置: 网页制作教程网站制作经验 >正文
asp语言高级教程

ASP根据分页参数从数据库快速提取数据并将结果存储到缓存

发表于2017/1/9 网站制作经验 0条评论 ⁄ 热度 1,925℃

如果一个数据库里有非常多的数据,那么我们用常规的方法来读取数据库的时候就会非常非常的慢,为什么常规的方法会非常慢呢?因为常规的方法是设定好记录集的分页属性,然后读取数据,而每次读取数据都是把所有的数据读了出来,然后再根据设定好的分页属性进行筛选,这样,如果总的数据量少了不明显,而当数据量非常庞大时,当然就会非常明显的感觉到慢了。

今天给大家介绍的是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
%>

如果不想看上面的具体源码,可以点下面的链接直接下载源码。

  • 暂无评论