【问题标题】:Batch Statements vs Multiple Value Inserts批处理语句与多值插入
【发布时间】:2020-12-18 02:11:39
【问题描述】:

JDBC 具有将多个查询组合在一个单元中并在一次网络访问中将其传递到数据库的特性。

如本代码示例所示:

String[] EMPLOYEES = new String[]{"Zuck","Mike","Larry","Musk","Steve"};
String[] DESIGNATIONS = new String[]{"CFO","CSO","CTO","CEO","CMO"};

String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?)";
PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL);

for(int i = 0; i < EMPLOYEES.length; i++){
    String employeeId = UUID.randomUUID().toString();
    employeeStmt.setString(1,employeeId);
    employeeStmt.setString(2,EMPLOYEES[i]);
    employeeStmt.setString(3,DESIGNATIONS[i]);
    employeeStmt.addBatch();
}
employeeStmt.executeBatch();

但是,对于 SQL,我们具有使用带有许多 VALUES 组的 INSERT 的功能,就像在:

String[] EMPLOYEES = new String[] {"Zuck","Mike","Larry","Musk","Steve"};
String[] DESIGNATIONS = new String[] {"CFO","CSO","CTO","CEO","CMO"};

StringBuilder insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?)"
    + ", (?, ?, ?)".repeat(EMPLOYEES.length - 1);

PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL.toString());

int columnIndex = 0;
for(int i = 0; i < EMPLOYEES.length; i++){
    String employeeId = UUID.randomUUID().toString();
    employeeStmt.setString(++columnIndex, employeeId);
    employeeStmt.setString(++columnIndex, EMPLOYEES[i]);
    employeeStmt.setString(++columnIndex, DESIGNATIONS[i]);
}

employeeStmt.execute();

我需要知道的是,这两种方法有什么区别?

观察:

第一个例子来自https://www.baeldung.com/jdbc-batch-processing,第二个例子是我编辑的。 英语不是我的母语,这是我的第一篇文章,非常抱歉。

【问题讨论】:

    标签: java sql jdbc


    【解决方案1】:

    INSERT 带有多个 VALUES 块,即多个 (val, ...) 块不是有效的 SQL 语法。哦,当然,一些 数据库可能支持这种扩展 语法,但并非所有数据库都支持。

    即使你的数据库这样做,使用该语法也会大大增加语句参数的数量,并且所有数据库都对单个请求中允许的参数数量有限制。实际限制因数据库而异。批处理没有批处理大小限制,除了用于存储所有值的内存量。

    【讨论】:

    • Insert with multiple values 绝对是有效的 SQL 语法,它在 ISO-9075-2:2016(SQL 标准)中定义,特别是在 14.11 结合 7.3 .只是有些数据库系统本身不支持表值构造函数(values 子句),只支持更简单的 values 子句的“单行”变体。
    猜你喜欢
    • 2016-01-24
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多