网站整站的缓存方式都是依靠的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. oracle安装报错[INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置)解决方法!

    最近在电脑上安装oracle12c,安装时,在执行检查环境步骤时候报错: [INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置) 最后在网上搜索解决方法,特记录下,以防以后再用到 ...

  2. 按格式读取csv文件内容

    string path = @"C:\Users\keen_\Downloads\upload\upload\Upload\20140701141934_export.csv"; ...

  3. C#条件运算符(?:)

    一.C#条件运算符(?:) 条件运算符(?:),有时也称为三元操作符“?:”.它是根据布尔型表达式的值返回?后面的两个值中的一个.如果条件为True,则计算第一个表达式并以它的计算结果为准:如果条件为 ...

  4. Java程序调用自动关机指令 1分钟内自动关机

    package com.swift;//可以不要这句 import java.io.IOException; public class Shutdown100 { public static void ...

  5. jquery简易的三级导航

    <!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">   ...

  6. EasyUI取消树节点选中

    $('#organTree').find('.tree-node-selected').removeClass('tree-node-selected'); 取消树的节点选中

  7. iftop工具指令选项记录

    iftop是实时监控网卡流量的工具,功能十分强大,指令选项非常多,用法比较复杂,下面记录一下命令的选择作用 相关参数及说明 1.iftop界面相关说明 界面上面显示的是类似刻度尺的刻度范围,为显示流量 ...

  8. win10下安装mysql-5.7.23-winx64

    Step1 官方下载地址 https://dev.mysql.com/downloads/mysql/ 选择手动下载版本 解压到自己指定的路径 上图中的my.ini及data文件夹在压缩包里是没有的, ...

  9. 利用DOM的方式点击切换图片及修改文字

    本案例主要学习理解,用到的几个DOM方法 01.getAttribute()方法,获取元素的属性值 02.setAttribute('src',source) 方法,用后边的值修改前边这个元素的属性值 ...

  10. python简单试题4

    ( ps : 题目中用到的一些random函数在最后末尾处有介绍)  1,在屏幕上显示跑马灯文字 import os # 调用os模块 import time # 调用时间模块 def main(): ...