Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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_Jdbc_Synchronization - Fatal编程技术网

Java 同步多个方法访问

Java 同步多个方法访问,java,jdbc,synchronization,Java,Jdbc,Synchronization,我需要同步一个mysql查询,这样只有一个用户可以同时访问指定的部分。我尝试了synchronized(){},但这不起作用。用户可以同时访问该方法。这是一个使用tomcat6的jsp Web应用程序。我需要这样做,因为当太多用户同时运行查询时,Web服务器会崩溃 String sql = "SELECT * FROM products;" ResultSet rs; //This block should be synchronized Statement s = con.createSta

我需要同步一个mysql查询,这样只有一个用户可以同时访问指定的部分。我尝试了
synchronized(){}
,但这不起作用。用户可以同时访问该方法。这是一个使用tomcat6的jsp Web应用程序。我需要这样做,因为当太多用户同时运行查询时,Web服务器会崩溃

String sql = "SELECT * FROM products;"
ResultSet rs;

//This block should be synchronized
Statement s = con.createStatement();
rs = s.excecuteQuery(sql);

while (rs.next()) {
// do some stuff..
}
谢谢你的帮助

编辑:我是如何尝试同步的

public class connect {

public static String URL = "url";
public static String USER = "root";
public static String PASSWORD = "password";
private Object lock = new Object();

public void getData() {

    Connection con;

    try {
        con = DriverManager.getConnection(URL, USER, PASSWORD);
        String sql = "SELECT * FROM products;";
        ResultSet rs;

        //This block should be synchronized
        synchronized(lock) {
            Statement s = con.createStatement();
            rs = s.executeQuery(sql);

            while (rs.next()) {
            // do some stuff..
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
}

我认为对象
lock
应该存储在服务器上。但正确的方法是什么呢

我不知道您是如何同步该方法的。但是,除非包含该方法的类是单例,否则它将无法工作

好的,要么是一个单例,要么是用于锁定方法的对象,必须是这样才能工作的

如果您只是同步了该方法,那么该类的多个实例将阻碍您的意图


但在我看来,你的架构似乎有问题。您使用的是某种连接管理器吗?

如果您使用的是DBCP,则只需配置
maxActive
属性,该属性由defulat设置为100。试图获得高于限制的连接的线程将被阻止。

如果正在处理的所有请求的
锁定对象相同,则代码正常

你怎么知道?如果为正在处理的每个请求创建一个新的
connect
类,则该类的每个实例都有一个不同的
lock
,并且同步块可以由不同的实例并发执行

如果您只有一个
connect
类的实例,那么您只有一个
lock
实例,并且您可以确保没有两个线程可以同时执行同步块

但是,即使只有一个
connect
类的实例,如果重构代码创建了该类的多个实例,也很容易中断同步。如果要确保此代码锁定所有线程,则必须将lock对象声明为static:

static final Object LOCK = new Object();
现在您可以确定JVM中只有一个

您还必须记住,如果您的应用程序在集群中运行,那么java同步将无法工作,因为您有多个JVM运行同一个应用程序。请看一看,以了解有关该主题的更多详细信息


顺便说一句,尝试遵循类命名约定。类名称应该以大写字母开头,因此将类重命名为
Connect

为什么不使用singleton并同步连接,或者在方法上同步

public class MyConnection {

    private Connection mConn;

    public static synchronized Connection getConnection() {
    if(mConn == null){
     mConn = createNewConnection();//your create method
    }
    return mConn;
    }

}

我的代码的另一部分中有一个错误的查询语句。如果执行了这个查询,它会执行类似于从表中选择*的操作,这会使我的mysql服务器崩溃。现在我已经修复了它,不必限制db访问。谢谢你们的帮助,伙计们

您能展示一下您是如何尝试在代码中进行同步的吗?您的
锁是
null
。虽然我不太熟悉同步块,但我认为它应该是一个实例,而不是
null
,这是我的错误,只是一个复制粘贴错误。我从未听说过
DBCP
,但它看起来很容易理解。也许我必须在代码中实现它。