Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同时处理多个请求_Java_Mysql - Fatal编程技术网

Java 同时处理多个请求

Java 同时处理多个请求,java,mysql,Java,Mysql,我有一个表,MySQL中的用户包括3个字段:ID(int)、Name(varchar)和UpdateTime(TimeStamp)。 我有一个java web应用程序和一个函数来获取表用户中的一条记录,然后检查UpdateTime是否在当前时间之前---->update UpdateTime by current time加上2小时 我的问题是,当有大约100个用户访问我的应用程序并请求该功能在同一时间获得相同的记录时,他们都会更新UpdateTime。但我只需要第一个用户update Upda

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

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

我怎么能做到?我真的不知道

谢谢


对不起,我的英语不太好:(

您的更新时间代码应该在同步块中

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

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

}
下面的代码可能会对您有所帮助

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

}
import java.util.Map;
导入java.util.HashMap;
公开课考试{
boolean是writelocktake;
Map cachedUsers=newhashmap();
公共静态void main(字符串[]args)引发异常{
测试t=新测试();

对于(int i=0;i确定。听起来像a。你尝试过什么吗?或者这只是实际编码之前的讨论??在看到注释后,我尝试向我的方法添加同步,但我没有看到任何更改。我认为在这种情况下,当对此方法发出100个请求时,只有一个进行更新,99个不进行更新。但是当我尝试使用J进行此操作时仪表,其中一些会更新(超过1个)还有一个没有。你可能想看看MySQL锁定读取的功能:在看到注释后,我尝试将synchronized添加到我的方法中,但我没有看到任何更改。我认为在这种情况下,当对这个方法发出100个请求时,只有一个做更新,99个不做。但是当我尝试用Jmeter做这件事时,其中的一些请求执行更新(超过1个)另一个没有。我再试了一次,它成功了,但我发现一个问题,当为该函数使用synchronized时,第一个请求访问函数和另一个请求必须等待。因此,最后一个请求必须等待太长时间才能获取数据。如果我只为更新时间代码块使用synchronized,所有请求都将在同一时间内获取数据ime和do轮流更新。我想要的是100个请求同时访问和获取int数据,但只需第一次更新。根据初始答案,您需要实现写锁,如果任何请求具有写锁,则应跳过其他请求并使用旧数据检索。在答案中添加代码,这可能会对您有所帮助。如果有效,请不要忘记vot不要忘记通知线程,否则它将阻止执行。