网站整站的缓存方式都是依靠的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. 2018.2.2 JavaScript中的封装

    JavaScript中的封装 1.封装的概念 通过将一个方法或者属性声明为私用的,可以让对象的实现细节对其他对象保密以降低对象之间的耦合程度,可以保持数据的完整性并对其修改方式加以约束,这样可以使代码 ...

  2. subline 安装 package control

    subline text2 输入 import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa154 ...

  3. 前端小记3——iOS与Android问题

    1.消除transition闪屏 (1)-webkit-transform-style:preserve-3d;  /*设置内嵌的元素在 3D 空间如何呈现:保留 3D*/ (2)-webkit-ba ...

  4. 01_13_JSP编译指令

    01_13_JSP编译指令 1. Directive Directive(编译指令)相当于在编译期间的命令 格式: <%@Directive 属性=”属性值”%> 常见的Directive ...

  5. Java实现随机出题,10道10以内加减法计算

    package com.swift; import java.awt.Toolkit; import java.util.Scanner; public class PlusQuiz { public ...

  6. Jquery的简单API

    dsfsdjgsdjgsdjkg <script>console.log('erftwet')</script>

  7. 42.VUE学习之--组件之子组件使用$on与$emit事件触发父组件实现购物车功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. spark和MR比较

    MapReduce: 分布式的计算框架 缺点:执行速度慢 IO瓶颈 ==> 磁盘IO 网络IO shuffle机制:数据需要输出到磁盘,而且每次shuffle都需要进行排序操作 框架的机制: 只 ...

  9. Python知识点入门笔记——特色数据类型(列表)

    Python中提供了列表这种数据类型(类型为list)来存储多个值构成的序列 用逗号将不同数据分隔开,整体放在一个方括号[]里就创建了列表 列表中的数据类型可以是相同的,也可以是不同的 列表中还可以嵌 ...

  10. 自动化运维之使用Python3收发电子邮件~~~附源码

    一.背景介绍   1.1  一些专业名称的解释 MUA——Mail User Agent,邮件用户代理.是用户与电子邮件系统的交互接口,一般来说它就是我们PC机上的一个程序,提供一个好的用户界面,它提 ...