我需要同步一个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/