2011-10-25 2 views
1

ここに他の同様の質問がありますが、私はすべての問題に対処しているものは見当たりませんでした。基本的に私は、HibernateでバックアップされたJPAを使用してJ2EEアプリケーションでデータアクセスとサービスレイヤーを設計することに取り組んでいます。JPAとHibernateで効率的なバッチ/バルク挿入を行うための確実な方法はありますか?

アプリケーションは大量のデータロード/更新操作を実行するため、これらの操作ができるだけ効率的にデータベースに取り込まれるようにしたいと考えています。正解は、挿入、更新のためのデータの大規模なコレクションを消費し、理想的

  • が尊重された構成またはコードでバッチサイズを設定し、どのように使用したものにコーディングするマージする方法コード、で、説明しますJPA(可能であれば生のHibernateを使用しない)
  • 効率的なメモリー/ 1次/ 2次レベルのキャッシュ使用を保証するためにJPAトランザクション・コマンド/注釈を使用する方法と時期。
  • これは、Hibernateが、ID識別子ジェネレータを使用する場合、JDBCレベルでバッチ処理を透過的に挿入を無効にすることを意味します。これはプライマリ識別子のシーケンスを使用することに関連していますか?
  • 私が知っておくべきなんらかの落とし穴。

    :私はHibernateとJ2EE/JPAについてのいくつかの関連質問をしてきましたし、あなたがこれらに追加する何かを持っている場合

    どちらが私には比較的新しい技術(私の他の質問を参照)されているようにしてください

注意

How should EntityManager be used in a nicely decoupled service layer and data access layer?

Should raw Hibernate annotated POJO's be returned from the Data Access Layer, or Interfaces instead?

答えて

3

アイデンティティジェネレータが使用されている場合、Hibernateがバッチインサートを無効にすることについての説明を説明できます。

IDジ​​ェネレータを使用してHibernateが新しいエンティティの識別子を取得するためには、実際にデータベースへの挿入を実行し、その値がInsertのデータベースによって割り当てられているため、その識別子値を取得するselectを実行する必要があります。これはシーケンスジェネレータの使用とは対照的です。この場合、Hibernateは多くの識別子を(必要な場合はバッチで)最前面に取得し、それらが挿入される前に挿入しているエンティティに割り当てることができます。

その違いは、[挿入]、[アイデンティティジェネレータの選択]、[選択]、[シーケンスの挿入]です。

したがって、Hibernateは、アイデンティティジェネレータが使用されているときにインサートを1つずつ実行する必要がありますが、シーケンスジェネレータが使用されたときには、それらを一括処理できます。

+0

すばらしい説明、ありがとう – Peter