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

我正在尝试寻找更快的方法来批量插入

我尝试使用 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 并发现有一千个插入。 我用秒表检查了时间,发现了插入时间:

min[900ms], avg[1100ms], max[2000ms] 每批处理

那么,任何人都可以向我解释一下,为什么 jdbcTemplate 在这种方法中进行单独的插入?为什么方法的名称是batchUpdate? 或者我可能以错误的方式使用这种方法?

最佳答案

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

?useServerPrepStmts=false&rewriteBatchedStatements=true

见:JDBC batch insert performance

关于java - 为什么 Spring 的 jdbcTemplate.batchUpdate() 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20360574/

相关文章:

java - 我无法使用断点进行调试

java - 使用 Spring 将文本文件直接注入(inject) String

spring - Thymeleaf - 使用 PUBLICID "null"请求的不受支持的实体

java - SpringBoot - BeanDefinitionOverrideExceptio

java - Spring Boot 是否可以使用 JAR 包装来提供 JSP?

java - 如何在spring mvc中使用带有freemarker的消息?

java - Spring Security 中的 "principal"是什么?

java - servlet 映射 url 模式上的双通配符 (*) 是什么意思?

database - Spring Batch Framework - 自动创建批处理表

java - 使用 restAssured 测试 Spring Boot Rest 应用程序