codecamp

OceanBase 批处理

通过将多个 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();
    }
}
OceanBase Failover 和 Load-Balancing
OceanBase 安全功能
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

OceanBase 控制台指南

OceanBase ODC 使用指南

OceanBase Web 版 ODC

OceanBase 客户端版 ODC

OceanBase Connector/J 开发者指南

OceanBase 什么是OceanBase Connector/J

OceanBase SQL 参考(MySQL 模式)

OceanBase SQL 参考(Oracle 模式)

OceanBase 基本元素

OceanBase 数据库对象

OceanBase 函数

OceanBase 单行函数

OceanBase 返回数字的字符串函数

OceanBase 通用比较函数

OceanBase 编码解码函数

OceanBase SQL 调优指南

OceanBase 相关协议

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }