U moet batch-bijlagen gebruiken.
- Maak een interface voor een aangepaste repository
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Maak een implementatie van
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;
});
}
}
- Verleng uw
JpaRepository
metSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
om op te slaan
someRepository.batchSave(records);
Opmerkingen
Houd er rekening mee dat, zelfs als u batch-inserts gebruikt, het databasestuurprogramma deze niet zal gebruiken. Voor MySQL is het bijvoorbeeld nodig om een parameter toe te voegen rewriteBatchedStatements=true
naar database-URL. Dus het is beter om SQL-logboekregistratie van stuurprogramma's (niet Hibernate) in te schakelen om alles te verifiëren. Kan ook handig zijn om stuurprogrammacode te debuggen.
U moet een beslissing nemen over het splitsen van records door pakketten in de lus
for (Record record : records) {
}
Een chauffeur kan het voor u doen, dus u heeft het niet nodig. Maar het is ook beter om dit ding te debuggen.
P.S. Gebruik var
niet overal.