You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle如何处理批量插入?JDBC executeBatch相关技术疑问

Oracle JDBC批量插入的性能与审计记录问题解析

先贴出你用到的JDBC批量插入代码:

String sql = "insert into t values (?, ?, ?)";
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < 100; i++) {
    preparedStatement.setInt(1, i);
    preparedStatement.setString(2, "jack"+i);
    preparedStatement.setString(3, "tom"+i);
    preparedStatement.addBatch();  
    if ((i+1)%10==0) {
        preparedStatement.executeBatch();  
    }
}

一、Oracle批量插入速度快的原因

Oracle确实不支持MySQL那种insert into t values(...), (...)的多行拼接插入语法,但它的JDBC驱动对executeBatch()做了针对性优化:
驱动会把批量内的所有绑定参数打包成一个数据包,一次性发送给数据库服务器,而非逐行executeUpdate()那样每插一条就发起一次网络请求。这种批量参数绑定的方式大幅减少了网络往返开销,同时数据库端可以一次性处理一组插入操作,省去了重复的SQL解析、执行准备步骤,因此速度比逐行插入快很多。

核心逻辑是靠「减少网络交互次数+数据库批量处理」实现高效插入,而非SQL语法拼接。

二、dba_audit_trail仅显示10条记录的原因

你看到的审计日志里只有每10条批量中最后一条的参数(比如9、19...99),是因为Oracle审计机制默认对同一个PreparedStatement的批量绑定操作,只会记录最后一次设置的绑定参数值。

你的代码中,每次循环都重复给同一个PreparedStatement设置新参数后调用addBatch(),直到凑够10条才执行executeBatch()。Oracle审计不会为addBatch()的每一次参数设置生成独立记录,只会捕获执行executeBatch()时最后一次设置的参数值,所以tom0至tom8这些前期参数不会出现在审计记录里。

内容的提问来源于stack exchange,提问作者Bao.Yang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:38:17