Sie müssen Stapeleinfügungen verwenden.
- Erstellen Sie eine Schnittstelle für ein benutzerdefiniertes Repository
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Erstellen Sie eine Implementierung von
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;
});
}
}
- Erweitern Sie Ihr
JpaRepository
mitSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
zu speichern
someRepository.batchSave(records);
Notizen
Denken Sie daran, dass der Datenbanktreiber diese nicht verwendet, selbst wenn Sie Stapeleinfügungen verwenden. Beispielsweise muss für MySQL der Parameter rewriteBatchedStatements=true
hinzugefügt werden zur Datenbank-URL. Es ist also besser, die Treiber-SQL-Protokollierung (nicht Hibernate) zu aktivieren, um alles zu überprüfen. Kann auch nützlich sein, um Treibercode zu debuggen.
Sie müssen eine Entscheidung über das Aufteilen von Datensätzen nach Paketen in der Schleife treffen
for (Record record : records) {
}
Ein Fahrer kann das für Sie erledigen, Sie brauchen ihn also nicht. Aber es ist besser, dieses Ding auch zu debuggen.
P. S. Verwenden Sie nicht var
überall.