同时处理许多请求

时间:2014-05-14 03:20:55

标签: java mysql

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

我的问题是,当大约有100个用户访问我的应用并请求该功能同时获取相同的记录时,所有这些用户都将更新UpdateTime。但我只希望第一个用户更新UpdateTime,后来者只会在没有更新UpdateTime的情况下获取数据。

我怎么做?我真的不知道。

感谢。

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

1 个答案:

答案 0 :(得分:0)

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

对你的对象进行写锁定,如果有人在进行更新操作之前已经消耗了锁定,同时另一个请求应该得到预先加载/更新后的数据。

java中的Chech synchronized关键字也检查读写锁机制。这可能会对你有所帮助。

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

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);
    }

}

谢谢, 拉夫