全部产品

批处理

通过将多个 UPDATEINSERT 语句分组为一个批处理,将整个批处理发送到数据库并一起处理,可以减少数据库的往返处理次数,从而提高应用程序性能。

OceanBase Connector/J 使用服务器 PrepareStatementStatements 作为与数据库进行批处理通信的标准,并通过 allowMultiQueriesrewriteBatchedStatements 两个参数进行管理。如果将 allowMultiQueriesrewriteBatchedStatements 选项设置为 true,则 OceanBase Connector/J 将仅使用文本协议。PrepareStatement(参数替换)在客户端由驱动程序处理。

rewriteBatchedStatements 对于插入查询,用于重写 batchedStatement 以在单个 executeQuery 中执行。当它处于活跃状态时,useServerPrepStmts 选项被设置为 falseallowMultiQueriestrue 时允许多值查询。

在 Oracle 和 MySQL 两种模式下,OceanBase Connector/J 对于批处理的设置会有不同。

Oracle 模式下的批处理

PrepareStatement 处理方式

useServerPrepStmts

rewriteBatchedStatements

allowMultiQueries

INSERT 操作

UPDATE 操作

true

true

true

Prepare 的 SQL String 会变成 VALUES(),(),()...的格式。

Prepare 的 SQL String 是正常格式,之后通过多次EXECUTE 设置参数。

true

false

Prepare 的 SQL String 会变成 VALUES(),(),()...的格式。

Prepare 的 SQL String 是正常格式,之后通过多次EXECUTE 设置参数。

false

true

Prepare 的 SQL String是正常格式,之后通过多次 EXECUTE 来设置参数。

Prepare 的 SQL String是正常格式,之后通过多次EXECUTE 来设置参数。

false

false

Prepare 的 SQL String 是正常格式,之后通过多次EXECUTE 设置参数。

Prepare 的 SQL String 是正常格式,之后通过多次EXECUTE 设置参数。

false

true

true

拼成一个完整的 VALUES(),(),()... 格式的字符串。

拼成一个完整的 VALUES(),(),()... 格式的字符串。

true

false

拼成一个完整的 VALUES(),(),()... 格式的字符串。

执行多条 UPDATE 语句。

false

true

执行多条 INSERT 语句。

执行多条 UPDATE 语句。

false

false

执行多条 INSERT 语句。

执行多条 UPDATE 语句。

Statement 处理方式

useServerPrepStmts

rewriteBatchedStatements

allowMultiQueries

INSERT 操作

UPDATE 操作

true

true

true

SQL String 会变成 VALUES(),(),()... 的格式。

SQL String 会变成 VALUES(),(),()... 的格式。

true

false

逐一执行 SQL。

逐一执行 SQL。

false

true

SQL String 会变成 VALUES(),(),()... 的格式。

SQL String 会变成 VALUES(),(),()... 的格式。

false

false

逐个执行 INSERT

逐个执行 UPDATE

false

true

true

SQL String 会变成 VALUES(),(),()... 的格式。

SQL String 会变成 VALUES(),(),()... 的格式。

true

false

逐一执行 SQL。

逐一执行 SQL。

false

true

SQL String 会变成 VALUES(),(),()... 的格式。

SQL String 会变成 VALUES(),(),()... 的格式。

false

false

逐一执行 INSERT

逐一执行 UPDATE

MySQL 模式下的批处理

PrepareStatement 处理方式

useServerPrepStmts

rewriteBatchedStatements

allowMultiQueries

INSERT 操作

UPDATE 操作

true

true

true

SQL String 会变成 VALUES(),(),()... 的格式。

逐一 Prepare 的 SQL String 是正常格式,之后通过多次 EXECUTE 来设置参数。

true

false

SQL String 会变成 VALUES(),(),()... 的格式。

逐一 Prepare 的 SQL String 是正常格式,之后通过多次 EXECUTE 来设置参数。

false

true

Prepare 的 SQL String 是正常格式,之后通过多次 EXECUTE 来设置参数。

Prepare 的 SQL String 是正常格式,之后通过多次 EXECUTE 来设置参数。

false

false

Prepare 的 SQL String 是正常格式,之后通过多次 EXECUTE 来设置参数。

Prepare 的 SQL String 是正常格式,之后通过多次 EXECUTE 来设置参数。

false

true

true

拼成一个完整的 VALUES(),(),()... 格式的字符串。

拼成一个完整的 VALUES(),(),()... 格式的字符串。

true

false

拼成一个完整的 VALUES(),(),()... 格式的字符串。

执行多条 UPDATE 语句。

false

true

执行多条 INSERT 语句。

执行多条 UPDATE 语句。

false

false

执行多条 INSERT 语句。

执行多条 UPDATE 语句。

Statement 处理方式

useServerPrepStmts

rewriteBatchedStatements

allowMultiQueries

INSERT 操作

UPDATE 操作

true

true

true

SQL String 会变成 VALUES(),(),()... 的格式。

SQL String 会变成 VALUES(),(),()... 的格式。

true

false

逐一执行 SQL。

逐一执行 SQL。

false

true

SQL String 会变成 VALUES(),(),()... 的格式。

SQL String 会变成 VALUES(),(),()... 的格式。

false

false

逐一执行 INSERT

逐一执行 UPDATE

false

true

true

SQL String 会变成 VALUES(),(),()... 的格式。

SQL String 会变成 VALUES(),(),()... 的格式。

true

false

逐一执行 SQL。

逐一执行 SQL。

false

true

SQL String 会变成 VALUES(),(),()... 的格式。

SQL String 会变成 VALUES(),(),()... 的格式。

false

false

逐一执行 INSERT

逐一执行 UPDATE

示例

public void test_execute_batch() {
    Connection conn = null;
    try {
        for (int q = 0; q < 2; q++) {
            for (int w = 0; w < 2; w++) {
                for (int e = 0; e < 2; e++) {


                    /**
                     *  useServerPrepStmts = true / false
                     *  rewriteBatchedStatements = true / false
                     *  allowMultiQueries = true / false
                     */
                    boolean uSPS = q == 0 ? false : true;
                    String rBS = w == 0 ? "false" : "true";
                    String aMQ = e == 0 ? "false" : "true";

                    String other_condition = "&rewriteBatchedStatements=" + rBS
                            + "&allowMultiQueries=" + aMQ;
                    conn = ConnectionUtils.getDefObOracleConnection(uSPS, true, other_condition);
                    Statement statement = conn.createStatement();

                    try {
                        statement.execute("DROP TABLE test_batch_t");
                    } catch (SQLException exp) {
                        //e.printStackTrace();
                    }

                    String sql = "create table test_batch_t(id int primary key, c1 varchar2(10))";
                    statement.execute(sql);

                    PreparedStatement ps = conn
                            .prepareStatement("insert into test_batch_t(id, c1) values (?, ?)");

                    for (int j = 0; j < 10; j++) {
                        ps.setInt(1, j);
                        ps.setString(2, j + "_test");
                        ps.addBatch();
                    }
                    ps.executeBatch();

                    ps = conn.prepareStatement("update test_batch_t set id = ? where c1 = ?");

                    for (int j = 0; j < 10; j++) {
                        ps.setInt(1, j);
                        ps.setString(2, j + "_test");
                        ps.addBatch();
                    }
                    ps.executeBatch();
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}