服务器端改XML冲突的解决方法讨论

xml|服务器|解决

XML文件不同access,那个access数据库好像有防止更改冲突的机制,但是我们“微小”的微软XMLDom没有给我们准备这个防止冲突!

 

具体例子:
两人同时调用写入XML文件的asp,结果只有一个人能写进去,另外一个却没有。
这跟XMLDom的工作方法有关。
用XMLDom.load(Path)载入文件之后,文本对象被载入内存,只读属性解除。当两个人同时载入一个XML文件时,XMLDom的内容是一样的。这样问题来了。
例如:
tmp1.XML
<Root></Root>

A君在XMLDom根中插入一个子标签<Chd1>Chd1</Chd1>,B君在XMLDom中又插入一个子标签<Chd2>Chd2</Chd2>。然后两个人保存,现在我们来看两人的XMLDom对象都是什么东西

A:
<Root>
<Chd1>Chd1</Chd1>
</Root>

B:
<Root>
<Chd2>Chd2</Chd2>
</Root>

OK,谁处理的慢,谁就被写进tmp1.XML文件啦。
但是我们想得到的是,两个人增加的东西都写入到XML文件,就是tmp1.XML的结果应该是这样的。

tmp1.XML
<Root>
<Chd1>Chd1</Chd1>
<Chd2>Chd2</Chd2>
</Root>

如何解决这个问题呢?

初步构想:
方法1:利用Application.Lock的特性:在载入XML文件之前,建立一个Application,并且Lock起来,在写入完成之后再Unload。那么,同时执行的asp就会停在Application.Lock那里,等Application重新开放再执行下来,从而达到XML异步写入的目的。具体例子:
tmp1.asp

以下内容为程序代码:
<%
application("XMLFiles1"),Lock
XMLDom.loat(path)
处理过程
XMLDom.save(path)
application("XMLFiles1").unlock
%>

这个好是好,但是有个缺点,如果有10个xml文件就要建立10个application,有10000个就要建立10000个application,天。

方法2:还是利用application,不过这次不同以前:这次只用到一个application,把各个操作请求编号起来,建立一个队列,再把操作请求的编号返回诶客户端。服务器每执行完一个操作就删一个编号,那么队列就一点一点的向前了。客户端根据自己的队列编号,定期刷新一下,要求服务器执行自己的操作。这个代码太复杂了,基本是这样的流程

服务器建立Application -> tmp2.asp用来添加操作编号 -> 返回当前操作的编号给客户端 -> 客户端定期刷新并提交自己的操作编号给tmp3.asp -> tmp3.asp用来做操作XML -> tmp3.asp判断是否轮到该编号,轮到就做,未轮到返回错误信息 -> tmp3.asp做了之后队列前移,删除操作编号

这个方法仅仅占用一个Application(可以对编号进行规则编制,例如[tmp1.XML|1|2|3}[tmp2.XML|1|2|3],其中第一个是xml文件名,后面那些是操作编号,|是间隔符,[]是分割每个文件的标识),但是客户端刷新时间不好定,太小了就占服务器资源太多,太久了队列移动就十分缓慢。

方法3:为每个操作建立一个暂时的xml文件,由服务器在一定时间内归总一次:这个方法对于对时间性需求不大的还可以,可是,对于时间性要求非常高的就不行了。例如论坛。(其实时间性要求不大的话完全不必要顾虑冲突这个问题)

时间: 2025-01-01 15:46:12

服务器端改XML冲突的解决方法讨论的相关文章

PHP针对常规模板引擎中与CSS/JSON冲突的解决方法_php技巧

本文实例讲述了PHP针对常规模板引擎中与CSS/JSON冲突的解决方法,有一定的实用价值,具体分析如下: 本文主要针对对象为Smarty与Dwoo 在Smarty中经常会出现和CSS/JS的语法存在冲突的情况,因为二者都需要使用大括号{}.虽然可以改Smarty的界定符,但你在一个现存系统中,去修改所有相关代码,是不划算的.解决方法如下: 1. 避免同时出现 通过外部引用的方式避免.问题是避无所避.所以这种情况只适合少量简单的情况. 2. 修改Smarty界定符 3.可以使用Smarty的lit

ThinkPHP和UCenter接口冲突的解决方法_php实例

本文分析了ThinkPHP和UCenter接口冲突的解决方法.分享给大家供大家参考,具体如下: 1.引出问题: 在UCenter中存在db和base两个类,恰巧这两个类也存在于ThinkPHP中,因此出现问题是必然的事情. db类:uc_client/lib/db.class.php base类:uc_client/model/base.php 2.问题解决方法: 只要消除"重名"即可解决,因此选择更改UCenter中的名称. 3.实际操作方法: db类: 更改db.class.php

ThinkPHP和UCenter接口冲突的解决方法

本文分析了ThinkPHP和UCenter接口冲突的解决方法.分享给大家供大家参考,具体如下: 1.引出问题: 在UCenter中存在db和base两个类,恰巧这两个类也存在于ThinkPHP中,因此出现问题是必然的事情. db类:uc_client/lib/db.class.php base类:uc_client/model/base.php 2.问题解决方法: 只要消除"重名"即可解决,因此选择更改UCenter中的名称. 3.实际操作方法: db类: 更改db.class.php

RealPlayer 11与kmplayer冲突的解决方法

  RealPlayer 11与kmplayer冲突的解决方法 解决的具体方法如下: 1.下载一个RealPlayer 10的cook.dll文件,将它替换掉RealPlayer 11产生的cook.dll文件. 2.无论RealPlayer 11安装在哪里,把下载回来的cook.dll替换掉"C:Program FilesCommon FilesRealCodecs "下的cook.dll就可以解决冲突问题.

android中view手势滑动冲突的解决方法_Android

Android手势事件的冲突跟点击事件的分发过程息息相关,由三个重要的方法来共同完成,分别是:dispatchTouchEvent.onInterceptTouchEvent和onTouchEvent. public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来进行事件的分发.如果事件传递到view,那么这个方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是

jQuery解析与处理服务器端返回xml格式数据的方法详解_jquery

本文实例讲述了jQuery解析与处理服务器端返回xml格式数据的方法.分享给大家供大家参考,具体如下: 1.php代码: <?php header("Content-Type:text/xml; charset=utf-8");//声明浏览器端返回数据的格式为xml文档格式 echo "<?xml version='1.0' encoding='utf-8'?>". "<comments>". "<c

模板视图和AngularJS之间冲突的解决方法_AngularJS

本文实例讲述了模板视图和AngularJS之间冲突的解决方法.分享给大家供大家参考,具体如下: 问题: 在php的mvc视图中,我们需要在加载的过程中 传递一些数据给模板: 如: 这里是某个 controller $data['users'] = {something from databases}; $this->load->view('home/index',$data); 这里是对应的视图 <div ng-controller="loadData"> &l

jQuery多个版本和其他js库冲突的解决方法_jquery

jQuery多个版本或和其他js库冲突主要是常用的$符号的问题,这个问题 jquery早早就有给我们预留处理方法了,下面一起来看看解决办法. 1.同一页面jQuery多个版本或冲突解决方法. <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>jQuery测试页</title> </head>

PHP中__autoload与smarty3冲突的解决方法

今天更新了smarty到3.0,结果发现项目中的__autoload()不能用了, 作为一个刚学习PHP 的菜鸟新手,搞了半天才明白问题出在它俩的冲突上,郁闷了好几天.后通过查看,Smarty3.0 中的SMARTY2_BC_NOTES文件,得 知Smarty3.0跟php的__autoload()有冲突: ------------------------------ == Autoloader == Smarty 3 does register its own autoloader with