java中用preparedstatement对mysql批量插入需三步:开启rewritebatchedstatements=true参数优化sql合并;循环addbatch()后分批executebatch()(建议1000~5000条/批);关闭自动提交并统一commit以提升事务吞吐量。

Java 中用 PreparedStatement 对 MySQL 做批量插入,核心是开启批处理模式、复用 SQL 模板、分批 add 并统一 execute,同时注意 MySQL 连接参数和事务控制,才能真正提升性能。
开启 MySQL 批处理支持(JDBC URL 关键参数)
MySQL 默认不启用批量插入优化,必须在 JDBC 连接字符串中显式添加参数:
-
rewriteBatchedStatements=true:这是最关键的参数。它让 MySQL 驱动将多条
INSERT INTO ... VALUES (?), (?)合并为一条带多个值的语句(如INSERT INTO t VALUES (1),(2),(3)),大幅减少网络往返和解析开销。 - 可选但推荐:useServerPrepStmts=false:禁用服务端预编译语句,避免批量时因服务端缓存导致的额外开销;配合
rewriteBatchedStatements=true效果更佳。 - 示例 URL:
jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&useServerPrepStmts=false&serverTimezone=UTC
使用 PreparedStatement.addBatch() 和 executeBatch()
标准流程是:获取 PreparedStatement → 循环设置参数并调用 addBatch() → 达到一定数量后调用 executeBatch() 清空批次 → 最后提交事务。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每次
addBatch()不执行 SQL,只是把参数缓存在客户端;executeBatch()才真正发送并执行整批语句。 - 建议每 1000~5000 条执行一次
executeBatch(),避免内存占用过高或单次请求超长(MySQL 默认max_allowed_packet限制)。 - 务必用
try-with-resources或手动close()释放 PreparedStatement,否则连接池资源可能耗尽。
配合事务提升吞吐量
默认自动提交会让每批都触发一次事务提交,极大拖慢速度。应显式关闭自动提交,所有批次在同一个事务中执行,最后统一 commit。
- 调用
connection.setAutoCommit(false)开启手动事务。 - 全部
executeBatch()完成后,再调用connection.commit()。 - 发生异常时,必须
connection.rollback()并重新抛出或处理,否则事务挂起影响后续操作。 - 注意:大事务会占用 MySQL undo log 和锁资源,需权衡单次事务大小与稳定性。
完整代码示例(含异常处理与资源管理)
以下是一个安全、可直接参考的批量插入片段:
String sql = "INSERT INTO user (name, age, email) VALUES (?, ?, ?)";
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
conn.setAutoCommit(false); // 关闭自动提交
for (int i = 0; i Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










