云数据库OceanBase入门教程 OceanBase 批处理

2024-02-26 开发教程 云数据库OceanBase入门教程 匿名 5

通过将多个 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();
}
}