日期:2014-05-20  浏览次数:20590 次

关于AJAX的执行状态判断
是这样的:
    网站页面有一个按钮当触发后执行Ajax,开始异步执行a.php后台程序。a.php执行时间较长需要一分多种才能够执行完成。
    我现在遇到这样一个问题,假如就我一个人打开这个网站触发了按钮,然后一分钟后当然就要到了自己想要的结果,但是假设有100个人甚至更多,同时打开了这个网站并同时触发按钮,程序运行当然是没问题的。不过这100个人触发的a.php都在做同样的工作,得到的也是同样的结果,显然是没必要的,是毫无意义的增加了服务器的压力。
    所以,我现在在想有没有一种方法可以当触发按钮时,先进行判断,如果a.php已经在执行了那么当前就return FALSE不要继续了。

    我本人想到了一个笨方法,即当a.php在执行时update数据库set remark字段为1(remark默认为0),当a.php执行完了后在最后再update数据库set remark为0,这样确实实现了我要的效果。但又遇到新的问题,在不用这种方法之前当Ajax a.php时因为是异步传输我可以任意刷新当前页,但当我按前面的方法处理后再刷新当前页就会假死直到a.php执行一分钟后才刷新成功。
   


   在线等。望大神指点指点!!!!!!!!!
------解决方案--------------------
如果这100个人的计算目标和结果是完全一致的话,也许你应该将其结果缓存下来?

甚至做成后台自动任务,不需要页面去触发,这100个人只需要查查结果就行了。
------解决方案--------------------
引用:
你说的情况,我明白。因为种种原因吧,就按我假设的情况,看能否帮实现吧,谢谢了


那么,需要细化下需求。

当100个人执行 a.php 时,只允许1个人成功执行并显示结果,其它99个人都直接显示失败?
------解决方案--------------------
return false 是啥意思啊?就是直接显示失败的意思么?

非集群环境下,你可以直接设置一个静态变量,比如:
   private static boolean isXXXRunning = false;
然后函数实现时先检测下该变量的值就行了,如果发现已经置位,可直接返回失败。


集群环境下,借助数据库确实会简单很多。
那么你要注意两件事情:
1、做更新时必须先做检测,类似:“Update  表  Set  mark = 1  Where  mark = 0”,这样如果更新数据集是0,说明该标志已经被别人抢占,直接返回失败;
2、两次更新不要在一个事务中,否则该记录会被持续锁定,其它都要等1分钟;对了,注意复位更新写在finally中。
------解决方案--------------------
首先没必要用数据库吧,内存不就可以了

其次客户端的刷新请求也被服务端拒绝服务了才卡住的是吧,服务端应该仅对该类型的ajax请求进行判断工作
------解决方案--------------------
哦还有集群~~~
------解决方案--------------------
引用:
关于刷新那个问题 该怎么解决好呀。。谢谢了


如果你的程序逻辑是正确的,不应该会有刷新问题。

请检查你的两次Update是否是独立的两个事务?
另外你是有用synchronized做了错误的同步控制?