第14章 バッチ処理


Hibernate を使ってデータベースに10万行を挿入する愚直な方法は、このようなものです:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
}
tx.commit();
session.close();
これは50,000番目の行のあたりで OutOfMemoryException で失敗するでしょう。Hibernate がセッションレベルキャッシュで、新しく挿入されたすべての Customer インスタンスをキャッシュするからです。この章で、こういう問題を回避する方法を説明します。
バッチ処理をするなら、JDBC バッチが使用可能であることが非常に重要です。そうでなければ手頃なパフォーマンスが得られません。JDBC バッチサイズを手頃な数値(例えば、10から50)に設定してください:
hibernate.jdbc.batch_size 20
identiy 識別子生成を使う場合は、Hibernate は JDBC レベルでインサートバッチングを無効にします。
また二次キャッシュとの相互作用が完全に無効になっているプロセスで、このような作業をしたいと思うかもしれません:
hibernate.cache.use_second_level_cache false
しかし、これは絶対に必要というわけではありません。なぜなら明示的に CacheMode を設定して、二次キャッシュとの相互作用を無効にすることができるからです。

14.1. バッチ挿入

新しいオブジェクトを永続化する場合、一次キャッシュのサイズを制限するため、定期的にセッションを flush() して clear() してください。
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
   
for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}
   
tx.commit();
session.close();
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る