oceanbase for oracle batch execute的测试记录和参数建议

数据库版本

OceanBase 4.3.5.5 (r105070022026031722-0639a4b5e9af1dae33bff3fefac15c3b62ae5571) (Built Mar 17 2026 22:56:58)

驱动版本

最新驱动版本:2.4.17

一些遇到的问题和验证后的结论

关于executeBatch返回的条数问题

参数:rewriteBatchedStatements=true&useArrayBinding=true
一句话结论:batch insert返回的rows不准确; batch update返回的rows可以准确;
如果rewriteBatchedStatements设置为false,又会导致insert、update非常慢;

insert 在batch模式下不能获取到真实的条数,就算拆分了executeBatch的批量条数并累加,也不能获取到真实的。因为可能执行的时候参数被合并掉了。
for (int i = 1; i <= rowCount; i++) {  
    ps.setInt(1, 1);  
    ps.setString(2, "updated-" + i);  
    ps.setLong(3, i);  
    ps.addBatch();  
    if (i % batchSize == 0) {  
        rows = rows + ps.executeBatch().length;  
        ps.clearBatch();  
        System.out.println("update ..."+rows);  
    }  
}  
rows = rows + ps.executeBatch().length;

但是update 在batch模式下,累加起来是可以的.

使用executeBatch执行更新语句性能差的问题

设置rewriteBatchedStatements=true;
设置autoCommit=false并设置定量提交;
设置useArrayBinding=true(必须);

测试是基于某头部保险公司的脱敏数据在自主总账产品上做的压测,后续再补上压测的性能参考。
整体而言,ob的性能还是很强的。

在总账系统中,单次导入1000w左右的分录,包含数据校验、交叉验证规则校验、凭证导入、凭证入账等动作,单次是在15-20分左右。

以前做ebs使用oracle的时候,一般初始化数据100w级别的纯新的账户导入,一般会在1小时以上。

如果大家有其他建议或者经验,也请帮忙分享