Devi usare gli inserti batch.
- Crea un'interfaccia per un repository personalizzato
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Crea un'implementazione di
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;
});
}
}
- Estendi il tuo
JpaRepository
conSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
per salvare
someRepository.batchSave(records);
Note
Tieni presente che, anche se stai utilizzando inserimenti batch, il driver del database non li utilizzerà. Ad esempio, per MySQL è necessario aggiungere un parametro rewriteBatchedStatements=true
all'URL del database. Quindi è meglio abilitare la registrazione SQL del driver (non Hibernate) per verificare tutto. Può anche essere utile per eseguire il debug del codice del driver.
Dovrai prendere una decisione sulla divisione dei record per pacchetti nel loop
for (Record record : records) {
}
Un autista può farlo per te, quindi non ne avrai bisogno. Ma è meglio eseguire il debug anche di questa cosa.
P.S. Non usare var
ovunque.