注册本站  论坛  繁體中文

慧民电脑芯片级维修-电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Dotnet >> ASP.NET >> Dotnet正文

Web网站缓存文件并发问题解决方案

文章来源:中国IT实验室整理 作者:佚名 更新时间:2008-10-8 15:37:11 【 】 【加入收藏

    我所负责的XXX.CN平台前期由于网站整体运行效率低因此采用了文件缓存的方式(文件缓存就是当某个页面第一次接受用户访问时将数据库中获取到的内容转化成xml文件的形式,并且存储在服务器硬盘当中,当后面的人再来访问时就只需要直接读取xml缓存文件即可,减少了读取数据库的次数,从而达到提高网站运行效率的目的),但是使用了这种方式其中有一个更新数据的问题,在更新和读取是就产生了并发的问题,说白了就是读取和写入的矛盾,当你的网站的访问量达到一定程度后,产生这种矛盾的概率越来越大,已至于访问者无法访问网站,流失了客户,对于我们酒店预订平台来说,流失的不是客户,而是白花花的金子,这个问题已经困挠了我许久,直到前几天,我在坐公交时回想起前一天给面试的人打印试卷的事,突然脑子里出现了“复制”这个词,并且把它扩展开想到了我们网站文件缓存的占用问题上,且已经用程序的方式成功运用到我们的网站中,下面就讲一下运行过程。

    首先,我们网站整站的缓存方式都是依靠的DataSet的ReadXml和WriteXml的方式实现的,这种方式在访问量不是很大的网站中是一点问题都没有的(最大可承受的日IP估计在8000-15000左右),但是当你的网站日IP访问量到达20000时,他就完全崩溃了,出现xml的并发占用问题日趋严重,于是我们就采用了文件流的形式去操作,具体代码如下:
  写入:
   Stream s = null;
   s = File.Open(FileName, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite);
   BinaryFormatter b = new BinaryFormatter();
   b.Serialize(s, ds);
   s.Close();
  读取:
   Stream s = null;
   s = File.Open(FileName, FileMode.Open, FileAccess.Read);
   BinaryFormatter b = new BinaryFormatter();
   ds = (DataSet)b.Deserialize(s);
   s.Close();
  这种方式在一定程度上解决了直接使用DataSet的ReadXml和WriteXml的方式带来的问题,但是当网站的日访问量达到40000或更高时,并发问题依然存在,其实存在并发的根本原因不是我们用了什么方式去读取或者写入(方式的不同的确在一定程度上可以解决一些问题,但根本原因没有得到根治),而是在两个或者更多个进程(有需要读取的也有需要写入的)在争抢同一个文件时程序如何给出一个可以让双方满意的方案,于是顺着这个思路,我有对程序做了以下改进:
  
   //读取锁,可以让一个文件被多个进程同时读取,也可以保证只被一个进程改写
   ReaderWriterLock locker = new ReaderWriterLock();//读取锁()
  
  写入:
   Stream s = null;
   try
   {
   locker.AcquireWriterLock(1500);//写锁定(写入时间最大允许在1500毫秒内完成,超时就立即退出)
   if (!File.Exists(FileName))
   {
   s = File.Create(FileName);
   }
   else
   {
   //创建此文件的一个副本,以供同时访问此文件的读取进程使用(就像打印机的复制功能),由于使用了写锁定,其他的写入进程都将转化为读取进程,而读取进程是不存在并发问题的
   File.Copy(FileName,FileName.Replace(".xml","Temp.xml"),true);
   s = File.Open(FileName, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite);
   }
   BinaryFormatter b = new BinaryFormatter();
   b.Serialize(s, ds);
   s.Close();
   }
   finally
   {
   if(s!=null)
   {
   s.Close();
   }
   locker.ReleaseWriterLock();//释放写锁定
   //这里可以加入删除临时文件的代码,但不建议这样做,我测试了下,会产生新的读写并发问题。
   }
  读取:
   Stream s = null;
   Stream sTemp = null;
   try
   {
   locker.AcquireReaderLock(1500);//读锁定(当所用文件被写锁定时超时时间为1500毫秒)
   s = File.Open(FileName, FileMode.Open, FileAccess.Read);
   BinaryFormatter b = new BinaryFormatter();
   ds = (DataSet)b.Deserialize(s);
   s.Close();
   }
   catch//这里使用catch主要是因为当读取方法所读的文件正在被改写时会获取空内容导致异常,或者写入超时导致文件内容出错时异常,或者读锁定超时后读取临时文件时刚好临时文件被删除时发生异常
   {
   locker.ReleaseReaderLock();//释放锁
   locker.AcquireReaderLock(1500);//再次锁定
   if(File.Exists(FileName.Replace(".xml","Temp.xml")))
   {
   //读取副本文件
   sTemp = File.Open(FileName.Replace(".xml","Temp.xml"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
   BinaryFormatter b = new BinaryFormatter();
   ds = (DataSet)b.Deserialize(s);
   sTemp.Close();
   }
   }
   finally
   {
   if(s!=null)
   {
   s.Close();
   }
   if(sTemp!=null)
   {
   sTemp.Close();
   }
   locker.ReleaseReaderLock();
   }
  好了,以上就是最终的改进方法,想通了很简单,就是创造个临时文件而已,从这件事我觉得大家在解决一个问题时不一定老是要从纯技术的角度去思考问题,之前我就想过用内存缓存的方式去做,但总觉得,会有一个更简单的方法的,于是使用了这种看似非常老土,而又没有任何技术含量的方式去解决了。不管使用哪种方式,能解决问题那就是好方法。其实想想世间万物都是相通的,只要我们发挥人类善于发掘和联想的能力,任何问题都不是问题。

  • 上一篇Dotnet:

  • 下一篇Dotnet: 没有了
  • 最 新 热 门
     IIS6架设网站的问题总结
     ASP程序直接连接MYSQL数据库
     实践xml缓存技术构建高性能web站点
     WEB共享与IIS相结合快速建立本地网站
     asp实现文件md5
     配置IIS蜜罐与黑客攻击
     asp处理xml数据的发送、接收类
     ASP教程:6大对象和数据库操作简单学
     ASP留言本教程
     ASP简单实现数字字符混合验证码
    最 新 推 荐
     Web网站缓存文件并发问题解决方案
     用Dojo和Ajax创建可重用和可重新发布
     ASP.NET网络编程中经常用到的27个函数集
     如何在.NET中访问MySQL数据库
     如何在ASP.Net Ajax中调用WebService
     ASP.NET 1.1 ListBox的注意事项
     如何利用JS实现对后台CS代码的调用
     .net开发中批量删除记录时如何实现全选功能
     ASP.NET开发中的八个最佳实践
     ASP.NET开发中的验证码技术
    相 关 文 章

    实践xml缓存技术构建高性能web站点
    WEB共享与IIS相结合快速建立本地网站
    SOA and Web services 新手入门
    闲话Java Web层框架优缺点 用哪个呢?
    如何通过Web Services上传和下载文件
    不要犯WEB字体编辑的10种错误
    如何在ASP.Net Ajax中调用WebService
    如何实现WebService的异步调用
    基于Web应用的UML建模与.NET框架开发
    SOA and Web services 新手入门i学习

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    门市地址:广东省佛山市南海区黄岐黄海路133号
    本网站所有内容未经许可不得转载或做其他使用