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
相关产品推荐
相关产品推荐

