2014-05-14 46 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