java - 同步多个方法访问

标签 java jdbc synchronization

我需要同步一个mysql查询,这样只有一个用户可以同时访问指定的部分。我尝试了 synchronized(){},但这不起作用。用户可以同时访问该方法。这是一个使用tomcat6的jsp 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应该存储在服务器上。但这样做的正确方法是什么?

最佳答案

如果正在处理的所有请求的 lock 对象都相同,则您的代码没问题。

你怎么能算出来呢?如果您为正在处理的每个请求创建一个新的connect类,那么该类的每个实例都有一个不同的,并且同步块(synchronized block)可以由不同的线程同时执行。实例。

如果您只有一个 connect 类的实例,那么您也只有一个 lock 实例,并且您确信没有两个线程可以同时执行同步块(synchronized block)。

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

static final Object LOCK = new Object();

现在您可以确定 JVM 中只有一个LOCK

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

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

关于java - 同步多个方法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16980142/

相关文章:

java - 在 Java 中使用 XSOM 解析 XSD 架构。如何访问元素和复杂类型

mysql - mysql中同步存储过程执行

Java Stream 有状态行为示例

c - 为什么这段代码会导致死锁? (生产者消费者模型)

java - 如何在 Java 的标准类中设置通用对象?

java - 为什么在大多数实时应用程序中首选 c 而不是 java

java - 为什么循环不将 long 作为其条件中的有效类型?

java - 结果集到缓存行集

java - 尝试将 java 连接到 mysql 时出现 MySQLSyntaxErrorException

MySQL 插入具有大量列的数据库表(使用 jdbc)