Java 同步多个方法访问
我需要同步一个mysql查询,这样只有一个用户可以同时访问指定的部分。我尝试了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
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
,但它看起来很容易理解。也许我必须在代码中实现它。