sql >> データベース >  >> RDS >> PostgreSQL

何千ものエンティティを永続化するための最も効率的な方法は何ですか?

    バッチ挿入を使用する必要があります。

    1. カスタムリポジトリのインターフェースを作成するSomeRepositoryCustom
    public interface SomeRepositoryCustom {
    
        void batchSave(List<Record> records);
    
    }
    
    1. 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;
            });
        }
    
    }
    
    1. 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は使用しないでください どこでも。




    1. エンティティフレームワーク6にMySQL接続を使用できません

    2. mysql、列名を繰り返し処理します

    3. SQLAlchemy:複数のテーブルで日ごとにグループ化

    4. PostgreSQLpsqlコマンドライン表示bytea列