我正在尝试寻找更快的方法来批量插入。
我尝试使用 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 - 使用 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 模式上的双通配符 (*) 是什么意思?