我有一个表MySQL中的用户包括3个字段:ID(int),Name(varchar)和UpdateTime(TimeStamp)。 我有一个java Web应用程序和一个函数来获取表用户中的一条记录,之后,检查UpdateTime是否在当前时间之前--->按当前时间加2小时更新UpdateTime。
我的问题是,当大约有100个用户访问我的应用并请求该功能同时获取相同的记录时,所有这些用户都将更新UpdateTime。但我只希望第一个用户更新UpdateTime,后来者只会在没有更新UpdateTime的情况下获取数据。
我怎么做?我真的不知道。
感谢。
P / s:对不起我的英语,似乎不太好:(
答案 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);
}
}
谢谢, 拉夫