逐条 update 太慢,改成批量更新语句提交

逐条 update 每条一次网络往返,几千条就全卡在等回包上。

JDBC 用 addBatch 攒批,MySQL 还得开驱动参数才会真正合并成一条。

MyBatis 换成 BATCH 执行器,也能用 foreach 拼多行更新。

每批控制在几百到一千条,批次太大事务和锁的持有时间都会拖长。

// 1) JDBC 批处理
try (PreparedStatement ps = conn.prepareStatement("UPDATE t SET name=? WHERE id=?")) {
    for (Item it : list) {
        ps.setString(1, it.getName());
        ps.setLong(2, it.getId());
        ps.addBatch();
        if (++n % 500 == 0) ps.executeBatch();
    }
    ps.executeBatch();
}
// JDBC URL 加参数,MySQL 才会把批量改写成多值语句
// jdbc:mysql://host:3306/db?rewriteBatchedStatements=true

// 2) MyBatis 一条 SQL 更新多行(不同值用 CASE WHEN)
UPDATE t SET name = CASE id WHEN 1 THEN 'a' WHEN 2 THEN 'b' END
WHERE id IN (1, 2);
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容