网站整站的缓存方式都是依靠的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();
  }

转载于:http://blog.csdn.net/zjlovety/article/details/7613094

xml的并发的更多相关文章

  1. Xml文件并发读写的解决方法

    之前对xml的操作大都是通过XmlDocument对象来进行,但是这样的情况对于没有并发的是非常合适的,最近遇到了并发读写xml文件的情况.通过文件流来操作能解决大部分的并发情况,对于极端的情况会有问 ...

  2. XML Publisher 并发程序由于"输出提交处理程序提交失败

    http://www.cnblogs.com/benio/archive/2012/03/30/2424900.html xmlp 报表运行完成后,状态为warning,其原因大概有以下3类:1.&q ...

  3. TestNG并发执行用例详解和范例

    前言 TestNG有多种并发方式支持,方法的并发,class级的并发,test级的并发等:根据实际应用可以灵活的配置和使用,下面分别对几种并发方法进行说明: 一.方法级并发 方法级并发即method级 ...

  4. Hibernate学习---缓存机制

    前言:这些天学习效率比较慢,可能是手头的事情比较多,所以学习进度比较慢. 在之前的Hibernate学习中,我们无论是CURD,对单表查询还是检索优化,我们好像都离不开session,session我 ...

  5. OAF_开发系列27_实现OAF中Java类型并发程式开发调用XML Publisher(案例)

    20150814 Created By BaoXinjian

  6. Tomcat并发数优化,修改service.xml性能调优 增加最大并发连接数

    可以在控制台的启动信息里看见,默认状态下没有被打开nio配置,启动时的信息,如下: 2010-2-1 12:59:40 org.apache.coyote.http11.Http11Protocol ...

  7. Tomcat 8.0的并发优化 - 优化server.xml的配置

    目录 1 Tomcat的3种运行模式 1.1 BIO - 同步阻塞IO模式 1.2 NIO - 同步非阻塞IO模式 1.3 APR - 可移植运行时模式 2 Tomcat的并发配置(配置Connect ...

  8. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  9. xml读取 避开并发(xml的一些操作)

    很多地方读取文件可能会出现并发现象 处理: 使用FileMode.Open, FileAccess.Read, FileShare.ReadWrite 避开并发 public static List& ...

随机推荐

  1. python脚本执行报错:SyntaxError: Non-ASCII character '\xe6' in file ip.py on line 4...

    报错信息 [root@chenbj ~]# python ip.py 192.168.1.1 File "ip.py", line 4 SyntaxError: Non-ASCII ...

  2. cuda流测试=basic_single_stream

    cuda流测试 /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. * * NVIDIA Corporation and ...

  3. R+hadoop

    这里面的配置 http://www.rdatamining.com/big-data/r-hadoop-setup-guide root@kali:~/hadoop_home/hadoop-1.2.1 ...

  4. 51nod——2476 小b和序列(预处理 思维)

    对于每一个元素,预处理出它作为最小值,两边可以作用到的最大位置.比如下标∈[0,8]的这个数组:1 8 6 2 5 4 3 8 7,1可以作用到所有区间,2可以作用到区间[1,8],第一个8可以作用到 ...

  5. P4746 C’s problem(c)

    时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比较差,经常通宵研究数学问题. 这次它因为这个数 ...

  6. Linux 系统性能:观察、测试、调优

    一个完整运行的 Linux 系统包括很多子系统(介绍,CPU,Memory,IO,Network,…),监测和评估这些子系统是性能监测的一部分.我们往往需要宏观的看整个系统状态,也需要微观的看每个子系 ...

  7. 初学python来进行odoo12版本开发

    这是我的第一篇博客.请多多指教! 首先要下载odoo-12的源代码 官方下载路径:          https://github.com/odoo/odoo/archive/12.0.zip 随便新 ...

  8. ubuntu 把软件源修改为国内源和更新(转载)

    1. 备份原始文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 2. 修改文件并添加国内源 vi /etc/apt/sourc ...

  9. Girls and Boys-hdu 1068

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. A计划 hdu2102(BFS)

    A计划 hdu2102 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国 ...