Anda harus menggunakan sisipan batch.
- Buat antarmuka untuk repositori khusus
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Buat implementasi
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;
});
}
}
- Perpanjang
JpaRepository
Anda denganSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
untuk menyimpan
someRepository.batchSave(records);
Catatan
Ingatlah bahwa, jika Anda bahkan menggunakan sisipan batch, driver database tidak akan menggunakannya. Misalnya, untuk MySQL, perlu menambahkan parameter rewriteBatchedStatements=true
ke URL database. Jadi lebih baik mengaktifkan driver SQL logging (bukan Hibernate) untuk memverifikasi semuanya. Juga berguna untuk men-debug kode driver.
Anda perlu membuat keputusan untuk memisahkan record berdasarkan paket dalam loop
for (Record record : records) {
}
Pengemudi dapat melakukannya untuk Anda, jadi Anda tidak akan membutuhkannya. Tapi lebih baik untuk men-debug hal ini juga.
P. S. Jangan gunakan var
di mana-mana.