MySQL PreparedStatement addBatch未按批量执行问题咨询
PreparedStatement批量插入逐条执行的问题解决
你遇到的问题核心原因主要有两个:
- JDBC连接默认开启了自动提交(autoCommit=true),导致每次
addBatch()后隐式触发了提交操作 - 部分数据库驱动(比如MySQL)默认没有启用批量语句优化,即使调用
executeBatch()也会逐条执行
解决步骤
关闭自动提交,手动控制事务
在获取数据库连接后,先关闭自动提交,等批量执行完成后再手动提交事务:connection.setAutoCommit(false);开启驱动的批量优化(以MySQL为例)
在JDBC URL中添加rewriteBatchedStatements=true参数,让驱动把批量语句合并成单次请求发送给数据库:jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
修正后的完整代码示例
try (Connection connection = DriverManager.getConnection(url, user, password)) { // 关闭自动提交 connection.setAutoCommit(false); String sql = "INSERT INTO your_table(col1, col2) VALUES (?, ?)"; try (PreparedStatement insertStatement = connection.prepareStatement(sql)) { for (int i = 0; i < 10000; i++) { insertStatement.setString(1, "a"); insertStatement.setString(2, "b"); insertStatement.addBatch(); // 可选:每N批提交一次,避免内存溢出,比如每1000条提交一次 if (i % 1000 == 999) { insertStatement.executeBatch(); insertStatement.clearBatch(); } } // 执行剩余的批量操作 insertStatement.executeBatch(); // 手动提交事务 connection.commit(); } catch (SQLException e) { // 发生异常回滚事务 connection.rollback(); e.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Jacky Guo
相关产品推荐
相关产品推荐

