我有一个表MySQL中的用户包括3个字段:ID(int),Name(varchar)和UpdateTime(TimeStamp)。
我有一个Java Web应用程序和一个函数来获取表Users中的一条记录,此后,检查UpdateTime是否在当前时间之前--->在当前时间加上2小时之前更新UpdateTime。

我的问题是,当大约有100个用户访问我的应用程序并请求该函数在同一时间获取相同的记录时,他们所有人都将更新UpdateTime。但是我只希望第一个用户更新UpdateTime,后来者将仅获得数据而无需更新UpdateTime。

我该怎么办?我真的不知道。

谢谢。

P / s:对不起,我的英语不好,:(

最佳答案

您的更新时间代码应位于同步块中。

对您的对象进行写锁定,如果有人在进行更新操作之前已经使用了锁定,并且同时有另一个请求出现,则应该获取预加载/更新后的数据。

Java中的Chech同步关键字还会检查读写锁定机制。这可能对您有帮助。

以下代码可能会对您有所帮助。

import java.util.Map;
import java.util.HashMap;


public class Test {
    boolean isWriteLockTaken;
    Map<Integer,String> cachedUsers = new HashMap<Integer,String>();

    public static void main(String[] args) throws Exception {
        Test t = new Test();
        for(int i=0;i<10;i++){
            t.updateAndGetUser(1);
        }
    }

    public String updateAndGetUser(Integer id) throws InterruptedException {
        if(isWriteLockTaken && !cachedUsers.containsKey(id)){
            this.wait();
        }

        if(!cachedUsers.containsKey(id)){
            isWriteLockTaken = true;
            synchronized(id){
                if(id==1){
                    // do processing to retrive user
                    System.out.println("Updating & loading user");
                    cachedUsers.put(id, "Gaurav");
                    return "Gaurav";
                }
            }
            isWriteLockTaken = false;
        }
        System.out.println("returning from cached list, not loading user details as it is already loaded");
        return cachedUsers.get(id);
    }

}


谢谢,
高拉夫

关于java - 同时处理许多请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23645088/

10-11 04:17