Трябва да използвате групови вмъквания.
- Създаване на интерфейс за персонализирано хранилище
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Създайте внедряване на
SomeRepositoryCustom
@Repository
class SomesRepositoryCustomImpl implements SomeRepositoryCustom {
private JdbcTemplate template;
@Autowired
public SomesRepositoryCustomImpl(JdbcTemplate template) {
this.template = template;
}
@Override
public void batchSave(List<Record> records) {
final String sql = "INSERT INTO RECORDS(column_a, column_b) VALUES (?, ?)";
template.execute(sql, (PreparedStatementCallback<Void>) ps -> {
for (Record record : records) {
ps.setString(1, record.getA());
ps.setString(2, record.getB());
ps.addBatch();
}
ps.executeBatch();
return null;
});
}
}
- Разширете своето
JpaRepository
сSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
за запазване
someRepository.batchSave(records);
Бележки
Имайте предвид, че дори ако използвате партидни вмъквания, драйверът на базата данни няма да ги използва. Например за MySQL е необходимо да добавите параметър rewriteBatchedStatements=true
към URL на базата данни. Затова е по-добре да активирате SQL регистрирането на драйвера (не Hibernate), за да проверите всичко. Също така може да бъде полезно за отстраняване на грешки в кода на драйвера.
Ще трябва да вземете решение относно разделянето на записите по пакети в цикъла
for (Record record : records) {
}
Шофьор може да го направи вместо вас, така че няма да ви трябва. Но по-добре да отстраните грешки и това нещо.
P. S. Не използвайте var
навсякъде.