客户端缓存策略

时间:2022-10-14 05:38:22

客户端缓存策略

摘要:将相关数据缓存到客户端的文本、Excel、Access文件与客户端内存中,通过执行脚本程序启动组件程序或其他程序,以实现客户端缓存数据与Web页面的交互,并将服务器端的相关处理程序迁移到客户端,在客户端建立“写缓存”以解决ASP.NET程序运行缓慢的问题。这些策略可用于JSP与C/S模式到B/S模式迁移开发中。

关键词:ASP.NET缓存;性能;页面;缓存策略

0 引言

Visual Studio.NET是开发软件的集成环境,它将Web程序与Windows程序的开发合二为一,开发效率高,Window程序的开发习惯几乎都可以沿用,所以在业界的应用越来越普及。

但Visual Studio.NET开发出来的Web(ASP.NET)程序,执行时占用的内存空间和CPU等资源较多,运行速度令人难以接受。为解决这个问题,ASP.NET尤其第2版,提供了很多基于“缓存”策略的改进措施,归纳起来有:

(1)页面输出缓存。将整个页面缓存到服务器的内存中,当有新请求时直接将其发送给客户端,服务器不必再处理。

(2)页面部分缓存。将页面的静态部分或相对不变部分缓存到服务器的内存中。

(3)数据缓存。将可能的待读数据缓存到服务器端的内存或其他地方。这是数据库管理系统(如SQL Server)的功能。

(4)利用存贮过程,提高数据库管理系统的处理速度。

(5)通过程序及配置文件Web.Config设置应用程序级缓存策略。

这些方法均在服务器端实施,能在一定程度上提高Web程序的运行效率。我们在开发某B/S模式的系统时,尽管用尽了以上缓存方法,服务器仍然频频瘫痪,这迫使我们去研究其他缓存方法,以提高系统的运行效率。

1 基本思想

将缓存位置从服务器端转移到客户端,在客户端利用各种方式建立缓存,减轻服务器的负担,提高Web程序的运行速度。

“待读”的数据可缓存于客户机的硬盘、内存等处。当缓存到硬盘时,可保存在文本文件、Excel文件、数据库文件(如DBF、MDB、DB)。当缓存到内存时,可保存到网页的DOM(Document Object Model)对象,如HTML型的列表框、下拉列表框、隐藏型文本框中,也可保存到特殊对象,如TOM(Table Object Model)对象,即HTML型的表格控件中。

也可将写回到服务器的数据缓存在客户端,仅当提交数据时,才将写缓存中的数据发送到服务器。

2 实施策略

为了在客户端实现缓存,采用脚本语言编写程序,完成对HTML型控件、文本文件、Excel工作簿、数据库文件(Access的MDB文件、FoxPro的DBF文件等)等的操作。下面针对缓存位置的不同,分别介绍各种策略。

2.1策略一:将数据缓存到客户端文本文件

本策略的基本思想是:用户先从服务器下载该用户相关的数据。并保存到客户端的某个文本文件,然后断开与服务器的连接。这样,用户的多数操作可在客户端执行,只有当用户提交数据时,才与库服务器交互。其具体实施过程如图1所示。

图1 将数据缓存到客户端文本文件

2.1.1转换为文本文件并打包

为了尽快地将数据库中的数据下载到客户端,可采用“预处理”策略,根据用户权限,先利用Windows程序从数据库提取数据,将其转换为文本文件,再压缩打包并保存到ftp文件夹。

2.1.2下载文本文件的缓存包

(1)获取压缩包名:在用户登录网页中调用报名网页,在报名网页的Page_Load事件中,根据登录网页中用户输入的相关信息,计算产生待下载压缩包的URL值,利用Response.Write()语句,将其写入到某表单的HTML控件中。核心语句为(C#语言):

string s0="":

string s1="

\“>”;

string s11=String.Format(ss1,myUrl.ToString());

Response.Write(s0+s11);

(2)生成ftp命令清单abc.txt:为了采用非交互方式执行下载命令ftp,需建立下载命令清单文件,因此需利用脚本语言,为网页onLoad事件编写处理程序,使之在客户端载入网页时,建立此清单文件。核心语句(JavaScript语言)为:

var strMyFileName="D:\\abc.txt":

var fileSysObj=new ActiveXObject("Scripting.FileSystemObject");

var myFile=fileSysO bj.CreateTextFile(strMyFileName,true);

var rarFn=FormLove.hideUrl.value;

var ffpCmd="get"+rarFn+"D:\\"+rarFn;

myFile.WriteLine(ftpCmd);

myFile.WriteLine(“quit”);myFile.close();

注意:需要将指定网站添加到“受信任的站点”。将命令清单abc.txt中的“get”命令,换成“put”或“mput”,可通过ftp命令,将客户端的文件上传到服务器。

(3)下载缓存包。调用ftp程序,执行abc.txt中的下载命令完成下载。核心语句为:

var shell=new ActiveXObject("Wscript.Shell");

shell.run("%SystemRoot%\\system32\\ftp.exe-v-n-i-d-s:D:

\\abc.txt-A 192.168.1.2"):

说明:如果担心ftp服务器不安全,可以先用此方法,从某个公开的虚拟目录下载一个专门下载文件的双接口的组件程序,通过脚本程序启动该组件程序,以完成缓存包的下载。

(4)解开缓存包。执行客户端解包软件RAR。核心语句为:

var rarCmd="D:\\WinRAR\\RAR.exe x D:\\"+rarFn+"D:\\";

shell.run(rarCmd);

2.1.3对缓存在客户端的数据进行操作

在网页中添加HTML型控件,通过脚本程序打开客户端的文本文件,从中读取数据,某个操作完成后,也可将写回到服务器的数据,缓存到客户端的文本文件。这里,主要用到客户端的FileSystemObject对象,其核心语句为:

myFile=fileSysObj.OpenTextFile(strMyFileName,8,true);

//8可追加,1为只读

var rarFn=FormLove.hideUd.value;//获取控件的值

s1=myFile.ReadLine():myFile.WriteLine(s2);

vat oOption=document.createElement("OPTION");

//这是采用DOM模式操作控件

oOption.text=s1;oOption.value=i;Form2.yourDept.add(oOption);

Form2.yourName.value=rarFn;//注意:需要用HTML语句定义

runat?"server"的新Form

2.1.4提交数据

将缓存在客户端文本文件中的数据,写回到数据库服务器的基本方法如下:

(1)从客户端的文本文件依次读取每行数据,分类(Update、Insert,Delete等)生成刷新服务端数据的SQL语句。注意:两条SQL语句之间用“分号(;)”分隔。

(2)将这些SQL语句保存到隐藏型文本框中,如FormOk.myUpdate.value=strUpdate。

(3)通过新Form的Acdon参数,指明接收SQL语句的网页文件,在该网页的Page_Load()事件中,获取隐藏型文本框中的SQL语句并执行之。核心语句为:

mycmdstr=Request.Form["myUpdate"].ToStnng().Trim();

mycmd.CommandText=mycmdstr;

int nSuccess=mycmd.ExecuteNonQuery();

本策略仅在下载与提交数据时,客户端才与服务器端发生交互,减轻了服务器的负担。它适合于给HTML型控件填充选项数据,如下拉列表框、普通的列表框的选项数据等。

2.2策略二:将数据缓存到客户端的Excel文件

对于结构化数据,在服务器端进行预处理时,要将待缓存的数据转换为Excel文件格式,客户端通过启动Excel来读/写缓存数据。本策略实现过程与“策略一”类似,基本步骤如下:

(1)生成Excel文件,再压缩打包并保存到ftp文件夹。

(2)下载Excel文件的压缩包并解压,方法与“策略一”相同。

(3)对客户端的缓存数据进行操作。

启动客户端的Excel软件,读/写缓存在Excel文件中数据,其核心语句为:

var myExcel=new ActiveXObject("Excel.Application");

myExcel.Workbooks.Open("D:\\abcd.xls");

var myWg=myExcel~Workbooks.Item(1);

var myWS=myWB.Worksheets(1);

var ss=myExcel.Workbooks.Count+"\n"

+myWB.Name+"\n"+myWS.Name+"\n";

SS+=myVVS.Cells(1,1).Value+"\n";myWS.Cells(4,3).Value=20000;

说明:与HTML型控件的交互,与“策略一”相同。

(4)提交数据,与“策略一”类似,不同之处是启动Excel去获取工作簿中的数据。

2.3策略三:将数据缓存到客户端的Access数据库文件

服务器端的数据本来保存在数据库,因此当在客户端缓存时,将其保存到数据库,如Access数据库,应是明智的选择。本策略的实现过程与“策略一”类似,基本步骤如下:

(1)生成MDB文件,然后压缩打包并保存到ftp文件夹。

(2)下载MDB缓存压缩包并解压,实现方法与“策略一”相同。

(3)对缓存在客户端的数据进行操作。

执行脚本程序,调用ADO组件程序,打开MDB文件,从中读写数据,其核心语句为:

var conn=new ActiveXObject("ADODB.connection");

var strDb="D:\\Student.mdb";

conn.ConnectionString="Data Source="+strOb+";

Jet OLEDB:Engine Type=5;

Provider='Microsoft.Jet.OLEDB.4.O':

User ID=Admin"var rs=new ActiveXObject("ADODB.Recordset");

conn.Open();rs.open("SELECT*FROM userlnfo",conn,1,3);

var oOption=document.createElement("OPTION"):

oOption.text=rS("userDept").Value;

oOption.value=rs("usedD").Value;

Form2.yourDept.add(oOption);

var sql="UPDATE userlnfo SET userName='杨其芸'

WHERE userlD='yqy"';

conn.Execute(sql);

与HTML型控件的交互,与“策略一”相同。

(4)提交数据,与“策略一”相似,不同之处是通过ADO组件去获取数据库中的数据。

2.4策略四:缓存在客户端的内存中

本策略旨在保存客户端要写回到服务器的数据。一般情况下,客户端写回到服务器的数据,要少于从服务器下载的数据。要写回到服务器的数据,当缓存到内存时,执行效率会更高。

写回服务器的数据,也是某个数据库表中的一条记录,因此我们在网页中添加一个HTML型的Table控件,然后利用脚本语言,编写往Table控件中存取数据的程序。其基本过程如下:

(1)建立表结构:在runat?"server"的Form中,添加HTML型Table控件,切换到HTML状态,使该表格仅留一行,并定义tbody型变量。主要的HTML代码为:

<TABLE id="myTable2"><TR><TD>用户名

</TD>……<TD>院系</TD></TR>

<tbody id="myBody2"></tbody>

</TABLE>

(2)在runat?"server"的Form中,添加一系列输入数据的HTML控件,并添加HTML型的按钮为该按钮的单击事件。该处理程序的主要语句为:

oRow=myBody2.insertRow():oCell=oRow.insertCell();

oCell innerText=Form2.yourName.value;

(3)提交数据:将缓存在HTML型Table控件中的数据取出,并写出刷新服务器数据的SQL语句。其核心语句为:

for(i=0;i<myBody2.rOWS.1ength;i++){

oRow=myBody2.rows(i):

for(j=0;j<oRow.cells.1ength;j++){strDisp+=oRow.celIs(j).

innerText+",”:} }

……;//生成刷新服务器数据的SQL语句

2.5策略五:服务器端主动向客户端下载数据

在很多的情况下,不能在预处理阶段准备数据,只能在程序运行时确定要缓存的数据,这时可采用服务器主动向客户端推送数据的方式。其基本流程如下:

(1)服务器端在某个事件(如Page_Load事件、DataGfid控件的SelectedlndexChange事件)发生时,执行相应的处理程序,在此程序中利用Response.Write()语句,将服务器中的数据,写到一系列的HTML语句。其核心语句(c#语言)为:

Data.DataRow myRow=this.myds.Tables["core"].

Rows[CurrentRowlndex];

string ss0="<form id\"FormLOVe\">";

string ss1="<input type=\"hide\" id=\"hXH\"value=\{0}\"/>";

string ss11=String.Format(ss1,myRow["XH"].ToString());

Response.Write(ss0):Response.Write(ss11);

(2)客户端再在某个事件触发时,执行相应的脚本程序,从这一系列的HTML语句中,获取服务器端下发的数据。参考前述各策略所用方法,可将下发数据保存到文本文件、Excel文件、MDB文件、Table对象或其他位置。其核心语句有:

var oXH=FormLove.hXH.value;//获取下发数据

Form2 txtXh.value oXH;

//保存到HTML型控件,也可保存到其他位置

(3)对缓存在客户端的数据进行操作。方法见前述各策略。

(4)提交数据。实现方法见前述各策略,如“策略IN”。

以上过程,实现了服务器端控件与客户端控件的双向交流,即服务器端控件可将数据传递给HTML型控件;通过表单中的Action选项,HTML型控件可将数据传递给服务器端控件。

2.6策略六:在客户端实现服务器端的某些功能

当将服务器端的数据缓存到客户端后,还可将相关的处理程序,迁移到客户端执行,进一步减轻服务器负担,大大增强B/S模式中客户端的处理能力,因此在某种程度上具有网格和分布式程序设计的思想。其基本步骤如下:

(1)将相关处理功能转换为可独立执行的程序,最好编写为具有双接口(dual interface)的COM型组件程序,使之既可以在Windows环境中执行,也可以在Web环境中被脚本调用。

(2)将相应程序压缩并保存到ftp文件夹。

(3)将可执行程序包下载到客户端并解开。方法见“策略一”中的介绍。

(4)客户端通过脚本程序调用这些程序。

①若是具有双接口的COM型组件程序,使用启动Excel时所使用的方法,即var myApp=new ActiveXObjec("myCommyApp")。其中“myCom”表示组件程序myComexe,“myApp”表示其主类名,如在Delphi为TmyApp=classfftypedComObjectJmyApp)。

②若是普通的程序,如ftp.exe、rar.exe,则可参考如下语句去执行:

var shell=new ActiveXObject("Wscript.Shell");

shell.runt("%SystemRoot%\\system32\\ftp.exe-V―n-i―d-s:D:

\\abc.txt-A 192.168.1.2");

3 结束语

将服务器端的相关数据,缓存到客户端的文本文件、Excel文件、Access文件与客户端内存中,在客户端通过执行脚本程序,启动组件程序或其他程序,读写这些缓存在客户端的数据,减轻了服务器端的负担。

同时将在服务器端执行的某些处理程序迁移到客观端,可以分担服务器的负载。

这些方法稍作修改可应用于JSP、ASP等Web程序中;同样,这些方法稍作整理与推广,可用于C/S模式系统向B/S模式的移植开发中。

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:网上办公系统文件的加密与网上注册 下一篇:网络安全协议的综合教学实践研究