现在客户有个需求,同时打开一个页面,需要提醒用户.比如两个用户同时打开一条记录的编辑页面,要同时提醒两个用户.请问下各位,有什么好的思路吗?

解决方案 »

  1.   

    常规来说,只能提醒后打开的人。可以用一个缓存(比如用Set)来记录当前编辑中的记录,那么每次打开前查一下一个记录,就可以提醒后打开的人。
    但是你将面临一个问题:就是如果之前编辑的人,直接把编辑页面给 X 掉,你很难保证捕获到这样的信息从而删除缓存中正在编辑的这个状态。
      

  2.   

    我有两个思路:
    1.通过session实现,但这种可能性能消耗较大
    2.通过数据库实现:每次打开一个页面,改变当前记录的状态.
      

  3.   

    Session没意义,Session是不能在多个会话之间共享的。Application还差不多。数据库可以,不过就会增加点代价,但好处是集群环境有效。一般来说这个缓存以 private static Set currentEditing; 就行了,注意控制并发。
      

  4.   

    貌似你5楼的回复被CSDN吃了。
      

  5.   

    受教了,向你看齐
    public Class CheckStatus{
      private static Set currentEditing=new HashSet();
      public synchronized boolean checkSta(xx){
        return CheckStatuc.currentEditing.add(xx) ;   
      }
    }
      

  6.   

    用Application这个应该会比较简单
    里面放个变量,然后判断一下
    最后在页面中把Application拿出来就行了吧
      

  7.   

    客户要求用用alert提醒。提醒后,把后面一个打开的页面关闭就可以了。
      

  8.   

    1.applictioncontext变量                                    好处:简单;缺点:集群失效;
    2.缓存(private static Set currentEditing)                  好处:简单 ;缺点:集群失效
    3.数据库存储                                               好处:集群可用 ;缺点:性能消耗稍大;

    不知我总结的有没有什么错的地方?另外还有个疑问,您提到了并发控制.我的程序不是多线程的,方法需要进行synchronized控制吗?
      

  9.   


    可以这么优化:
    [code]
    public Class CheckStatus{
      private static Map<String, Integer> currentEditing=new HashMap<String, Integer>();
      public static synchronized boolean checkAndSet(String id){
        Integer counter = currentEditing.get(id);
        if (counter == null) {
          currentEditing.put(id, 1);
          return true;
        } else {
          currentEditing.put(id, counter+1);
          return false;
        }
      }
      public static synchronized void leave(String id) {
        Integer counter = currentEditing.get(id);
        if (counter != null) {
          if (counter > 1) {
            currentEditing.put(id, counter-1);
          } else {
            currentEditing.remove(id);
          }
        }
      }
      public static synchronized int current(String id) {
        Integer counter = currentEditing.get(id);
        if (counter == null) {
          return 0;
        } else {
          return counter;
        }
      }
    }
    [/code]
      

  10.   

    X,为啥 <code> 内的内容全没了算了,懒得重打了1.applictioncontext变量 好处:简单;缺点:集群失效;
    —— 比起static而言没那么简单;
    2.缓存(private static Set currentEditing) 好处:简单 ;缺点:集群失效
    —— 集群失效确实是最大问题
    3.数据库存储 好处:集群可用 ;缺点:性能消耗稍大;
    —— 是的另外还有一招,就是用MemCache之类的外置缓存组件,它们自己能实现集群。
      

  11.   

    数据库端加一个记录状态的字段再加一个sequence,拿到之后看状态;修改完成了的放回去sequence+1 每次打开一个修改页面就发送请求如果状态为游人没有放回去的状态提醒后面的再发送给前一个知道;保存时看sequence小于数据库中的时候提醒有别人修改过了,是否强制替换