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

Hibernateバッチ挿入はどのように機能しますか?

    Hibernateプロパティhibernate.jdbc.batch_size は、休止状態で挿入または更新ステートメントを最適化する方法ですが、フラッシュループはメモリの枯渇に関するものです。

    エンティティのhibernatefire1 insertステートメントを保存しようとしたときにbatchsizeがないため、大きなコレクションを操作する場合は、save hibernatefire1ステートメントごとに

    次のコードのチャンクを想像してみてください:

    for(Entity e : entities){
    session.save(e);
    }
    

    ここで、休止状態は、コレクション内のエンティティごとに1つの挿入ステートメントを起動します。コレクションに100個の要素がある場合、100個の挿入ステートメントが実行されます。このアプローチは、主に2つの理由からあまり効率的ではありません。

    • 1)第1レベルのキャッシュを指数関数的に増やし、OutOfMemoryExceptionですぐに終了する可能性があります 。
    • 2)各ステートメントのネットワークラウンドトリップが原因でパフォーマンスが低下します。

    hibernate.jdbc.batch_sizeとフラッシングループには2つの異なる目的がありますが、補完的です。

    Hibernateは最初のものを使用して、バッチに含まれるエンティティの数を制御します。 Hibernateのカバーの下でjava.sql.Statement.addBatch(...)を使用します およびexecuteBatch() メソッド。

    したがって、hibernate.jdbc.batch_sizeは、addBatch()を呼び出す必要がある回数をhibernateに通知します。 executeBatch()を呼び出す前 。

    したがって、このプロパティを設定しても、メモリの消耗を防ぐことはできません。

    メモリを処理するには、定期的にセッションをフラッシュする必要があります。これがループのフラッシュの目的です。

    あなたが書くとき:

    for(Entity e : entities){
    if (i % 100 == 0 && i>0) {
                        session.flush();
                        session.clear();
                    }
    }
    

    100エンティティごとにセッションをフラッシュしてクリアするように休止状態に指示しています(メモリを解放します)。

    では、2つの間のリンクは何ですか?

    最適化するには、jdbc.batch_sizeを定義する必要があります フラッシュパラメータは同じです。

    選択したbatch_sizeよりも低いフラッシュパラメータを定義すると、休止状態はセッションをより頻繁にフラッシュするため、効率的ではないbtachサイズに到達するまで小さなバッチが作成されます

    2つが同じ休止状態の場合、コレクションのサイズがbatch_sizeの倍数でない場合、最後のバッチを除いて、最適なサイズのバッチのみが実行されます。

    次の投稿 この最後のポイントの詳細については



    1. ディレクトリ内のファイルのリストを見つける際の問題

    2. MySQLDATETIMEDIFFクエリ

    3. OracleXDBでの制御文字のエスケープ

    4. MariaDBで特定の文字のASCIIコードを返す2つの方法