Du måste använda batch-inlägg.
- Skapa ett gränssnitt för ett anpassat arkiv
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Skapa en implementering av
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;
});
}
}
- Utöka ditt
JpaRepository
medSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
för att spara
someRepository.batchSave(records);
Anteckningar
Tänk på att om du ens använder batch-inlägg kommer inte databasdrivrutinen att använda dem. Till exempel, för MySQL, är det nödvändigt att lägga till en parameter rewriteBatchedStatements=true
till databasen URL. Så bättre att aktivera föraren SQL-loggning (inte Hibernate) för att verifiera allt. Kan också vara användbart för att felsöka drivrutinskod.
Du måste fatta beslut om att dela upp poster efter paket i loopen
for (Record record : records) {
}
En förare kan göra det åt dig, så du behöver det inte. Men det är bättre att felsöka den här saken också.
P. S. Använd inte var
överallt.