OceanBase 批处理

2021-06-30 16:03 更新

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

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

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

在 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();
    }
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号