2014-05-14 47 views
0

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

而我的问题是,当有大约100个用户访问我的应用程序并请求该功能获得相同的记录在同一时间,他们都将更新UpdateTime。但是我只想要第一次用户更新UpdateTime,后来者只会得到没有更新UpdateTime的数据。

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

谢谢。

P/S:很抱歉,我的英语水平,这似乎是不好:(

+0

查找[在Java并发(http://docs.oracle.com/javase/tutorial/essential/concurrency/)。听起来像[竞态条件](http://en.wikipedia.org/wiki/Race_condition)。 – Qix

+0

你有没有试过。或者它只是实际编码之前的讨论? – Ashish

+0

看到评论后,我尝试添加同步到我的方法,但我没有看到任何更改。 我认为在这种情况下,当向这个方法发出100个请求时,只有一个更新,另外99个请求不这样做。但是当我试图用Jmeter来做时,其中一些更新(超过1),而另一些则不更新。 – ManhDV

回答

0

你更新时间码应该在synchronized块你的对象

采取写锁,如果有人已经消耗。之前更新操作,并在同一时间的另一个请求到来应该得到的预更新数据后加载/去锁。

再检查一下synchronized关键字在Java中同时选中读写锁机制。这可以帮助你。

˚F根据代码可能会对你有所帮助。

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

} 

感谢, 拉夫

+0

看到评论后,我尝试添加同步到我的方法,但我没有看到任何变化。 我认为在这种情况下,当向这个方法发出100个请求时,只有一个更新,另外99个请求不这样做。但是当我试图用Jmeter来做时,其中一些更新(超过1),而另一些则不更新。 – ManhDV

+0

我会尽力实现并发布在这里为你... – Gaurav

+0

我再次尝试,它的工作,但我看到一个问题,当使用同步该功能,第一个请求访问功能和另一个必须等​​待。所以最后的请求必须等待很长时间才能获得数据。如果我仅使用同步更新时间代码块,则所有请求都将同时获取数据并依次更新。我想要的是100次请求访问,并在同一时间获取数据,但只是第一次更新。 – ManhDV