C#编程中关于数据缓存的经验总结
一直以来,我都发现程序的运行速度不够理想。通过查代码,发现程序对数据库的访问非常频繁,而且检索出来的数据量比较大。为了让程序运行快起来,我想对程序采用适当的缓存方法。
我在C#尝试了5种方法进行数据缓存,具体如下:
(如有遗漏,错误欢迎大家指正,欢迎提建议。)
1:Session方法:此方法是针对于每个用户来的,如果用户量比较大,那么建议不要采用此方法,否则会大量耗尽服务器资源。
2:Cache方法:
2.1:对于每个用户来说访问的数据最好是一致的,否则要用不同的key标识不同的缓存。 (要缓存的数据至少也是按用户类型来分的,如果每个用户可以按条件检索得到不同的数据的话,即使不造成数据混乱, 估计也跟session没什么区别了,用户很多的话太耗服务器资源)。
2.2:如果每个用户得到的数据都不同,而且用户数量较多,应该考虑往客户端存了。
2.3:需要考虑当生成缓存后,如果数据库中的数据发生变化了。而造成用户得不到最新的数据的问题。(可参考:"数据库缓存相关性"的文章)
3:往客户端写文件
首先A页面在运行的时候,从数据库中取到了数据集,在显示出数据报表的同时,A页面将数据集转化为xml文件,写入客户端。客户如果要打印该报表,那么程序就从客户端取存入的xml文件,如果xml文件存在,就从中读取数据并显示成打印报表显示出来。如果xml文件不存在,就提示重新检索数据。
例如:
<script type=text/javascript> //给客户机上写文件
function ws()
{
var fso,ctf;
fso = new ActiveXObject("Scripting.FileSystemObject"); //IE的安全设置里面需要把没有标记为安全的ActiveX控件和脚本设置
为“启用”,才不会提示。
ctf = fso.CreateTextFile("c:\\luiTestfile.txt",true);//true为可以覆盖原有文件
ctf.Write("write content in file");
ctf.Close();
}
</script>
但是,每次操作客户端的文件,系统都会提示是否运行没有标识的ActiveX控件,用户点否就不能成功保存文件了。
4:用cookie来存储 www.elivn.com
--------------------写cookie----------------------------------------
HttpCookie myCookie = new HttpCookie("DateCookie_lui");//DateCookie_lui为要创建的cookie键值对的键名。
DateTime now = DateTime.Now;
myCookie.Value = now.ToString();//给此cookie赋值
myCookie.Expires = now.AddMinutes(1);//设置cookie的过期日期和时间(此为1分钟后过期),在客户再次访问服务 器同时附带cookie文件,如其中以这个名字的cookie过期,就会自动清除它。
this.Response.SetCookie(myCookie);//将此cookie写入客户端
--------------------读cookie----------------------------------------
HttpCookie myCookie = new HttpCookie("myTestCookie_lui");//创建一个cookie操作对象
myCookie = Request.Cookies["DateCookie_lui"];//得到客户端传来的cookie数据,DateCookie_lui为要取的cookie键值对的键名
if(myCookie != null)
Response.Write(" Cookie Name is:"+myCookie.Name+". Cookie Value is:"+myCookie.Value);
else
Response.Write(" Not found!");
用cookie的方法存储数据,经过我反复尝试发现cookie存储值的大小被限定,(每项仅可存汉字仅1686个,字母或数字仅5059个),且cookie文件的大小一旦超过大小(20kb左右)就会导致找不到页面的错误,且每个cookie文件中只能存20项键值对。
5:尝试在A页面把dataset转化为xml字符串,隐藏于页面中,post提交到B页面;在B页面取到该xml字符串,然后将xml字符串转化为dataset,生成报表。
将dataset转化为xml的字符串:
vDataXmlStr=ds.GetXml();//得到数据集的xml字符串
this.hidXmlStr.Value=vDataXmlStr;//存入页面的隐藏元素中
------------------------------------------------------------------------
将xml字符串转化为dataset:
vXmlStr = Request.Form["hidXmlStr"].ToString();//取xml字符串的变量值
System.IO.StringReader vSR = new System.IO.StringReader(vXmlStr);//读取字符串
ds.ReadXml(vSR);//将xml读入dataset中
------------------------------------------------------------
页面中如果字体变成乱码:要设置该页面的<%@ Page responseEncoding="gb2312"%>