zoukankan      html  css  js  c++  java
  • 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来存储
    --------------------写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"%>

  • 相关阅读:
    Flutter 中那么多组件,难道要都学一遍?
    【Flutter实战】自定义滚动条
    Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
    一篇文章掌握 Python 内置 zip() 的全部内容
    Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
    Python 3.10 版本采纳了首个 PEP,中文翻译即将推出
    Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
    Python 为什么推荐蛇形命名法?
    Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
    Python 为什么不用分号作终止符?
  • 原文地址:https://www.cnblogs.com/lj821022/p/726704.html
Copyright © 2011-2022 走看看