Java 在MySQL表中插入多行:线程与批更新

Java 在MySQL表中插入多行:线程与批更新,java,mysql,multithreading,jdbc,prepared-statement,Java,Mysql,Multithreading,Jdbc,Prepared Statement,假设,我们必须通过java代码在mysql表中插入20行。以下哪种方法有效?为什么 1使用executeBatch将所有insert语句生成一个批,然后使用Preparedstatement的提交方法一次性插入所有行 2为每次插入创建线程。每个线程插入一行 PS:插入是通过web API完成的,因此我们需要实时显示插入失败或成功的状态。下面的描述可能会给出答案 是的,通常批量插入一次比单次插入快,因为它避免了每个insert语句发生的中间通信 但有时它会导致问题,因为insert/update语

假设,我们必须通过java代码在mysql表中插入20行。以下哪种方法有效?为什么

1使用executeBatch将所有insert语句生成一个批,然后使用Preparedstatement的提交方法一次性插入所有行

2为每次插入创建线程。每个线程插入一行


PS:插入是通过web API完成的,因此我们需要实时显示插入失败或成功的状态。

下面的描述可能会给出答案

是的,通常批量插入一次比单次插入快,因为它避免了每个insert语句发生的中间通信

但有时它会导致问题,因为insert/update语句获取表/行上的排他锁,这意味着当时没有其他进程/连接可以使用表

如果有多个进程同时使用DB,其中一些进程正在从表中读取,另一些进程正在写入,那么整个操作将在批量插入时锁定/停止

因此,大容量插入将比单次插入锁定表的时间更长,如果锁定时间更长,而DB未针对它进行调优,则可能会导致其他进程出现问题

如果您只是在没有其他操作的情况下插入数据库,那么从一个速度快得多的文件中进行批量插入,如果您有其他进程,请考虑锁定调整批量插入频率


这里给出了答案:

我就是这样将多个实例添加到SQL数据库的: 使用php2java.com根据java转换此代码,并查看您需要什么

global $db; //create database object
//if database tables does not exist already create them
        if($db->query('SELECT 1 from store_access') == FALSE) {
            $query = 'CREATE TABLE store_access (
                `access_id` bigint(20) NOT NULL AUTO_INCREMENT,
                `user_id` bigint(20) NOT NULL,
                `store_id` bigint(20) NOT NULL,
                `sales` bigint(20) NOT NULL,
                `purchase` bigint(20) NOT NULL,
                `vendors` bigint(20) NOT NULL,
                `clients` bigint(20) NOT NULL,
                `products` bigint(20) NOT NULL,
                `warehouse` bigint(20) NOT NULL,
                `returns` bigint(20) NOT NULL,
                `price_level` bigint(20) NOT NULL,
                `reports` bigint(20) NOT NULL,
                `expenses` bigint(20) NOT NULL,
                PRIMARY KEY (`access_id`)
            )'; 
            $result = $db->query($query) or die($db->error);
            echo 'Store Access Table created.<br>';
        } //creating user level table ends.

我想说executeBatch是更好的选择,因为它将在一个db调用中进行插入,并且性能良好,多线程本身会使这些插入变慢,并且可能会使用来自db池的多个套接字连接,如果您只有一个连接,然后所有其他线程将等待使用该连接。这取决于数据的价值。在某些情况下,当我需要归档某些内容时,当不需要实时数据时,我有一个带有linkedqueue的线程,该线程会写入数据库,而主线程只是将记录添加到该队列中进行处理。@Marvin。这是否意味着多线程比第一个选项慢。我需要它的实时性。在我的例子中,我有单线程来处理顺序插入,而不是阻塞主进程。这个答案我已经看到了。它并不是说通过一个线程插入一行来比较多线程。是的,但您提到过为每个插入创建线程意味着多个单插入。所以每个线程都会进行单次插入,所以DB会被命中那么多次。但这些不是“顺序”的多次单次插入。所以我们无法从你的答案中比较时间效率。可能你没有得到我的答案。请参阅,虽然请求是异步进行的,但SQL插入将按顺序进行,这意味着有一种内部锁定机制,它将为每次插入锁定行/表,然后处理其他请求。您可以在这里得到更多的解释:我们可以使用行锁,因为多个插入位于不同的行中,所以线程可以并行执行。