一尘不染

为什么Spring的jdbcTemplate.batchUpdate()这么慢?

spring

我正在尝试找到批量插入的更快方法。

我试图用jdbcTemplate.update(String sql)插入几个批处理,其中sql是由StringBuilder 构建的,看起来像:

INSERT INTO TABLE(x, y, i) VALUES(1,2,3), (1,2,3), ... , (1,2,3)

批次大小恰好是1000。我插入了近100批次。我使用秒表检查了时间,发现插入时间:

min[38ms], avg[50ms], max[190ms] per batch

我很高兴,但是我想使代码更好。

在那之后,我尝试以如下方式使用jdbcTemplate.batchUpdate:

    jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
                       // ...
        }
        @Override
        public int getBatchSize() {
            return 1000;
        }
    });

sql看起来像哪里

INSERT INTO TABLE(x, y, i) VALUES(1,2,3);

我很失望!jdbcTemplate以单独的方式批量执行每行1000行的插入。我看了一下mysql_log,发现那里有一千个插入。我使用秒表检查了时间,发现插入时间:

每批最小[900ms],平均[1100ms],最大[2000ms]

那么,有人可以向我解释一下,为什么jdbcTemplate在这种方法中进行分隔插入?为什么方法的名称是batchUpdate?还是我以错误的方式使用此方法?


阅读 1684

收藏
2020-04-19

共1个答案

一尘不染

JDBC连接URL中的这些参数可以大大提高批处理语句的速度-根据我的经验,它们可以加快处理速度:

?useServerPrepStmts = false&rewriteBatchedStatements = true

2020-04-19