バッチ挿入を使用する必要があります。
- カスタムリポジトリのインターフェースを作成する
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
-
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;
});
}
}
-
JpaRepository
を拡張しますSomeRepositoryCustom
を使用
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
保存する
someRepository.batchSave(records);
メモ
バッチ挿入を使用している場合でも、データベースドライバはそれらを使用しないことに注意してください。たとえば、MySQLの場合、パラメータrewriteBatchedStatements=true
を追加する必要があります。 データベースURLへ。すべてを検証するために(Hibernateではなく)ドライバーSQLログを有効にすることをお勧めします。ドライバーコードのデバッグにも役立ちます。
ループ内のパケットによるレコードの分割について決定する必要があります
for (Record record : records) {
}
ドライバーがあなたに代わってそれをすることができるので、あなたはそれを必要としないでしょう。ただし、これもデバッグすることをお勧めします。
P. S. var
は使用しないでください どこでも。