可能会出现性能问题

一般用户可以忽略本节内容。

上一节我们完成了一个简单的数据交互任务: 让用户通过网页输入年月,后台根据用户输入的年月,统计出该月各产品的销售数量,并显示在用户浏览器上。

不管是输入页面"saletj.htm",还是显示统计结果的页面"showtj.htm",其实都是不存在的,是后台动态生成的,是虚的。

动态生成网页的优势是灵活,但是也有一个劣势,就是性能。

以上一节的例子为例,每次统计的耗时和数据量是成正比的,如果用户每次访问都重新进行一次统计,且用户量和数据量都比较大,那么就必须考虑服务器的负担问题了。

要减轻服务器的负担,我们可以这样考虑:

1、本月的销售数据在不断变化中,适合每次访问都重新统计,而之前月份的销售数据已经固定,没有必要重复统计。

2、所以我们可以将之前月份的统计结果保存为一个网页,这样以后访问时,无需再次进行统计 ,直接发送已经生成的网页即可。

3、至于本月销售数据,当然每次都重新统计是最好的,但实际上用户统计本月数据的概率是最大的,每次重新统计,也可能导致服务器负担过重。

4、所以对于本月统计,我们一样可以将统计结果保存为一个网页,用户每次访问时,判断这个网页的生成时间,如果没有超过1小时,就直接发送这个网页,否则重新进行统计。

5、为方便管理,可以在"d:\web"目录下,建立一个子目录"temp",用于存放这些临时生成的网页。

这是修改后的HttpRequest事件的代码,要正常运行这段代码,请在"d:\web"目录下,建立一个子目录"temp":

Select Case e.Path
    Case "saletj.htm"
        Dim sb As New StringBuilder
        sb.AppendLine("<form enctype='multipart/form-data' action='showtj.htm' method='post'
id='form1' name='form1'>")
        sb.AppendLine(
"
请输入要统计的年月:</br></br>")
        sb.AppendLine(
"
: <input type='number' name='year' id='year' min='1999' max='2018'><br/><br/>")
        sb.AppendLine(
"
: <input type='number' name='month' id='month' min='1' max='12'><br/><br/>")
        sb.AppendLine(
"<input Type='submit' name='Sumbit' id='Sumbit' value='
开始统计'>")
        sb.AppendLine("</form>")
        e.WriteString(sb.ToString)
    Case "showtj.htm"
        Dim y As Integer = 0
        Dim m As Integer = 0
       
Integer.TryParse(e.
PostValues("year"), y)'获取用户输入的年
        Integer.TryParse(e.
PostValues("month"), m) '获取用户输入的月
        If y = 0 OrElse m = 0 Then
            e.WriteString(
"
请输入正确的年月!")
        Else
            Dim fl As String = "d:\web\temp\" & y & m & ".htm"
'
合成文件名
            If FileSys.FileExists(fl) Then
'
如果文件存在
                Dim ifo As new FileInfo(fl)
               
'如果不是本月,或者文件最近一次修改时间在1个小时内,则发送文件后返回
               
If y <> Date.Today.Year OrElse m <> Date.Today.Month OrElse (Date.Now - Ifo.LastWriteTime).TotalHours < 1
                    e.WriteFile(fl)
                    Return
                End If
            End If
           
'
根据输入的年月,统计各产品的销售数量
            Dim g As New SQLGroupTableBuilder(
"
统计表1", "订单") '这里使用后台统计,如果数据已经全部加载可以直接用GroupTableBuilder
           
'g.ConnectionName = "数据源" '外部数据表的话要指定数据源名称
            g.Groups.AddDef("产品")
            g.Totals.AddDef(
"
数量")
            g.VerticalTotal = True
            g.Filter =
"Year(
日期) = " & y & " And Month(日期) = " & m  '后台统计才可以使用这种表达式的哦
            Dim dt As DataTable = g.Build(False)
           
'统计数据,将结果保存为网页,然后发送这个网页
            Dim sb As New StringBuilder
            sb.AppendLine(y & "年" & m & "月各产品销售数量: <br/><br/>")
            For Each dr As DataRow In dt.DataRows
                sb.AppendLine(dr("产品") & ":" & dr("数量") & "<br/>")
            Next
            sb.AppendLine("<br/>")
            sb.AppendLine("统计时间:" & Date.Now) '在网页显示统计时间,提醒用户这可能不是最新的结果
            FileSys.WriteAllText(fl, sb.ToString, False, Encoding.UTF8) '记得用UTF8格式保存网页
            e.WriteFile(fl) '发送保存的网页
        End
If

End
Select

如果之前月份的销售数据也有调整的可能,导致之前月份的统计结果也会变化,只是变化的概率和频率不高,那么你可以调整代码,检测之前月份统计文件的创建时间,如果超过1天 (具体时长根据需要调整),就重新统计。


本页地址:http://www.foxtable.com/mobilehelp/topics/0023.htm