Du skal bruge batch-indlæg.
- Opret en grænseflade til et brugerdefineret lager
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Opret en implementering af
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;
});
}
}
- Udvid dit
JpaRepository
medSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
for at gemme
someRepository.batchSave(records);
Noter
Husk, at hvis du overhovedet bruger batch-indsættelser, vil databasedriveren ikke bruge dem. For MySQL er det f.eks. nødvendigt at tilføje en parameter rewriteBatchedStatements=true
til database URL. Så bedre at aktivere driver SQL-logning (ikke Hibernate) for at verificere alt. Kan også være nyttig til at fejlsøge driverkode.
Du bliver nødt til at træffe beslutning om at opdele poster efter pakker i løkken
for (Record record : records) {
}
En chauffør kan gøre det for dig, så du får ikke brug for det. Men bedre at fejlsøge denne ting også.
P. S. Brug ikke var
overalt.