Bạn phải sử dụng chèn hàng loạt.
- Tạo giao diện cho kho lưu trữ tùy chỉnh
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Tạo triển khai
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;
});
}
}
- Mở rộng
JpaRepository
của bạn vớiSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
để tiết kiệm
someRepository.batchSave(records);
Ghi chú
Hãy nhớ rằng, nếu bạn thậm chí đang sử dụng chèn hàng loạt, trình điều khiển cơ sở dữ liệu sẽ không sử dụng chúng. Ví dụ:đối với MySQL, cần thêm một tham số rewriteBatchedStatements=true
đến URL cơ sở dữ liệu. Vì vậy, tốt hơn là bật ghi nhật ký SQL trình điều khiển (không phải Hibernate) để xác minh mọi thứ. Cũng có thể hữu ích để gỡ lỗi mã trình điều khiển.
Bạn sẽ cần phải đưa ra quyết định về việc chia nhỏ các bản ghi theo các gói trong vòng lặp
for (Record record : records) {
}
Một người lái xe có thể làm điều đó cho bạn, vì vậy bạn sẽ không cần nó. Nhưng tốt hơn hết bạn nên gỡ lỗi điều này.
P. S. Không sử dụng var
ở khắp mọi nơi.