asp吧+ 关注 关注: 帖子:16

  

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

    %>


    1楼  2019/7/3 16:01:47  回复

  发表回复

    发帖