JDBC - 批处理

  • 简述

    批处理允许您将相关的 SQL 语句分组为一个批处理,并通过一次调用将它们提交到数据库。
    当您一次向数据库发送多条 SQL 语句时,可以减少通信开销,从而提高性能。
    • JDBC 驱动程序不需要支持此功能。您应该使用DatabaseMetaData.supportsBatchUpdates()方法来确定目标数据库是否支持批量更新处理。如果您的 JDBC 驱动程序支持此功能,则该方法返回 true。
    • addBatch()的方法声明的PreparedStatement,CallableStatement的用于个别语句添加到该批料中。这executeBatch() 用于开始执行组合在一起的所有语句。
    • executeBatch() 返回一个整数数组,数组的每个元素代表相应更新语句的更新计数。
    • 正如您可以将语句添加到批处理中一样,您可以使用 clearBatch()方法。此方法删除您使用 addBatch() 方法添加的所有语句。但是,您不能有选择地选择要删除的语句。
  • 用语句对象批处理

    这是将批处理与语句对象一起使用的典型步骤序列 -
    • 使用任一createStatement()方法创建 Statement 对象。
    • 使用setAutoCommit()将自动提交设置为 false 。
    • 在创建的语句对象上使用addBatch()方法将尽可能多的 SQL 语句添加到批处理中。
    • 在创建的语句对象上使用executeBatch()方法执行所有 SQL 语句。
    • 最后,使用commit()方法提交所有更改。

    例子

    以下代码片段提供了使用 Statement 对象进行批量更新的示例 -
    
    
    // Create statement object
    
    Statement stmt = conn.createStatement();
    
    
    
    // Set auto-commit to false
    
    conn.setAutoCommit(false);
    
    
    
    // Create SQL statement
    
    String SQL = "INSERT INTO Employees (id, first, last, age) " +
    
                 "VALUES(200,'Zia', 'Moo', 30)";
    
    // Add above SQL statement in the batch.
    
    stmt.addBatch(SQL);
    
    
    
    // Create one more SQL statement
    
    String SQL = "INSERT INTO Employees (id, first, last, age) " +
    
                 "VALUES(201,'Raj', 'Kumar', 35)";
    
    // Add above SQL statement in the batch.
    
    stmt.addBatch(SQL);
    
    
    
    // Create one more SQL statement
    
    String SQL = "UPDATE Employees SET age = 35 " +
    
                 "WHERE id = 100";
    
    // Add above SQL statement in the batch.
    
    stmt.addBatch(SQL);
    
    
    
    // Create an int[] to hold returned values
    
    int[] count = stmt.executeBatch();
    
    
    
    //Explicitly commit statements to apply changes
    
    conn.commit();
    
    
  • 使用 PrepareStatement 对象进行批处理

    这是将批处理与 PrepareStatement 对象一起使用的典型步骤序列 -
    1. 使用占位符创建 SQL 语句。
    2. 使用任一prepareStatement() 方法创建 PrepareStatement 对象。
    3. 使用setAutoCommit()将自动提交设置为 false 。
    4. 在创建的语句对象上使用addBatch()方法将尽可能多的 SQL 语句添加到批处理中。
    5. 在创建的语句对象上使用executeBatch()方法执行所有 SQL 语句。
    6. 最后,使用commit()方法提交所有更改。
    以下代码片段提供了使用 PrepareStatement 对象进行批量更新的示例 -
    
    
    // Create SQL statement
    
    String SQL = "INSERT INTO Employees (id, first, last, age) " +
    
                 "VALUES(?, ?, ?, ?)";
    
    
    
    // Create PrepareStatement object
    
    PreparedStatemen pstmt = conn.prepareStatement(SQL);
    
    
    
    //Set auto-commit to false
    
    conn.setAutoCommit(false);
    
    
    
    // Set the variables
    
    pstmt.setInt( 1, 400 );
    
    pstmt.setString( 2, "Pappu" );
    
    pstmt.setString( 3, "Singh" );
    
    pstmt.setInt( 4, 33 );
    
    // Add it to the batch
    
    pstmt.addBatch();
    
    
    
    // Set the variables
    
    pstmt.setInt( 1, 401 );
    
    pstmt.setString( 2, "Pawan" );
    
    pstmt.setString( 3, "Singh" );
    
    pstmt.setInt( 4, 31 );
    
    // Add it to the batch
    
    pstmt.addBatch();
    
    
    
    //add more batches
    
    .
    
    .
    
    .
    
    .
    
    //Create an int[] to hold returned values
    
    int[] count = stmt.executeBatch();
    
    
    
    //Explicitly commit statements to apply changes
    
    conn.commit();