Я пытаюсь найти более быстрый способ сделать пакетную вставку.
Я попытался вставить несколько партий с jdbcTemplate.update(String sql), где sql был создан StringBuilder и выглядит так:
INSERT INTO TABLE(x, y, i) VALUES(1,2,3), (1,2,3), ... , (1,2,3)
Размер партии был ровно 1000. Я вставил почти 100 партий. Я проверил время, используя StopWatch, и выяснил время вставки:
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 и нашел там тысячу вставок. Я проверил время, используя StopWatch, и выяснил время вставки:
min [900ms], avg [1100ms], max [2000ms] за пакет
Итак, может ли кто-нибудь объяснить мне, почему jdbcTemplate делает разделенные вставки в этом методе? Почему имя метода batchUpdate? Или, может быть, я использую этот метод неправильно?