可能会出现性能问题
一般用户可以忽略本节内容。
上一节我们完成了一个简单的数据交互任务: 让用户通过网页输入年月,后台根据用户输入的年月,统计出该月各产品的销售数量,并显示在用户浏览器上。
不管是输入页面"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天 (具体时长根据需要调整),就重新统计。