Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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多线程和MySQL同步_Java_Mysql_Multithreading - Fatal编程技术网

Java多线程和MySQL同步

Java多线程和MySQL同步,java,mysql,multithreading,Java,Mysql,Multithreading,关于这个问题: 计数器int已同步,对executeQuery的函数调用未同步。 我得到的结果 柜台:1 来自MYSQL的行:1 柜台:2 来自MYSQL的行:1 柜台:3 来自MYSQL的行:1 MYSQL的预期输出->行:应与计数器相同 所有线程在第一个查询中同时运行。因此,它们得到相同的结果id。但是,它们为计数器迭代同步。对我来说,这是荒谬的。这种行为有记录吗?我怎样才能绕过它? Verifier.java public void run() { int id = 0; St

关于这个问题:

计数器int已同步,对executeQuery的函数调用未同步。 我得到的结果

柜台:1

来自MYSQL的行:1

柜台:2

来自MYSQL的行:1

柜台:3

来自MYSQL的行:1

MYSQL的预期输出->行:应与计数器相同

所有线程在第一个查询中同时运行。因此,它们得到相同的结果id。但是,它们为计数器迭代同步。对我来说,这是荒谬的。这种行为有记录吗?我怎样才能绕过它? Verifier.java

public void run() {

int id = 0;
    String query = "SELECT ID_num FROM Searches WHERE checked='0'";
    ResultSet results;
    synchronized (this.database) {
        results = this.database.executeQuery(query);
        if (results.next()) {
            id = results.getInt(1);
            query = "UPDATE Searches  SET checked='1' WHERE ID_num='"
                    + id + "'";
            this.database.counter++;
            System.out.println(this.database.counter);
            System.out.println(id);

        }
    }
}
Core.java

for (int i = 0; i < verifier.length; i++) {
            MySQL database=new MySQL();
           verifier[i]=new Thread(new Verifier(database,i+1));  
            verifier[i].start(); 
    }
编辑: 我看到问题了,你更新查询没有提交结果。您将在更新后提交,您将看到表计数也将更改

编辑2:OP说

MYSQL的预期输出->行:应与计数器相同

但在当前的代码中,这是无法实现的。以下是程序的逻辑:

  • 获取选中了
    的<0'
    的所有行
  • 线程将更新使用
    checked='1'获取的所有行。
  • 第二个线程出现,它尝试查找选中了
    的行,如果第一个线程提交行,则该行将始终为0
  • 为了实现这种行为,您不应该在查询中硬编码
    checked='0'
    ,而应该从线程计数[传递给验证器的
    i
    值]中派生出来

    编辑3: 这里有一个修正,当为每个线程创建新的
    数据库时,线程不会按顺序执行。以上几点仍然适用,但这将使实现预期结果更加困难。

    编辑: 我看到问题了,你更新查询没有提交结果。您将在更新后提交,您将看到表计数也将更改

    编辑2:OP说

    MYSQL的预期输出->行:应与计数器相同

    但在当前的代码中,这是无法实现的。以下是程序的逻辑:

  • 获取选中了
    的<0'
    的所有行
  • 线程将更新使用
    checked='1'获取的所有行。
  • 第二个线程出现,它尝试查找选中了
    的行,如果第一个线程提交行,则该行将始终为0
  • 为了实现这种行为,您不应该在查询中硬编码
    checked='0'
    ,而应该从线程计数[传递给验证器的
    i
    值]中派生出来

    编辑3:
    这里有一个修正,当为每个线程创建新的
    数据库时,线程不会按顺序执行。以上几点仍然成立,但这将使实现预期结果更加困难。

    您的代码原样意味着更新查询、增量和sysout在3个不同的对象锁上同步,而不是1。您的代码原样意味着更新查询,增量和sysout在3个不同的对象锁上同步,而不是在1个对象锁上。计数器只是用来显示同步是否实际工作。我的主要问题是所有线程都获取相同的行,而不是连续的行。请澄清您所说的“更新后提交,您将看到表计数也将更改”是什么意思。如果“自动提交”设置为false,则仅执行查询不会提交结果。因此,要么将auto commit设置为true,要么显式提交。计数器仅用于显示sync实际工作。我的主要问题是所有线程都获取相同的行,而不是连续的行。请澄清您所说的“更新后提交,您将看到表计数也将更改”是什么意思。如果“自动提交”设置为false,则仅执行查询不会提交结果。因此,要么将auto commit设置为true,要么显式提交。
    public class MySQL{
        int counter=0;
    ....
    
    }