逐条 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






暂无评论内容