2

org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanSpring xml、persistence.xml、および JPA 2 アノテーションを使用して構成された JPA の方法で行われた Spring/Hibernate を使用しています。

機能的には問題なく、正しく持続します。ただし、B の大規模なコレクションを持つ双方向の OneToMany を持つエンティティ A をできるだけ早く格納する必要があります。

私はpersistence.xmlでさまざまなオプションを使用して、挿入を高速化し、メモリ使用量を削減しようとしています(アプリケーションは読み取りと同じくらい書き込みます)

<property name="hibernate.id.new_generator_mappings" value="true" />
<property name="hibernate.jdbc.batch_size" value="50" />
<property name="hibernate.order_inserts" value="true" />
<property name="hibernate.order_updates" value="true" />
<property name="hibernate.cache.use_query_cache" value="false" />
<property name="hibernate.cache.use_second_level_cache" value="false" />

永続化は次を使用して行われます

entityManager.persist(instanceOfA)

追加情報を編集:

各エンティティには、次のような生成された ID があります。

@Id
    @Column(name="ID")
    @GeneratedValue(strategy=GenerationType.AUTO, generator="SEQUENCE_GENERATOR")
    @SequenceGenerator(name="SEQUENCE_GENERATOR", sequenceName="MY_SEQUENCE", allocationSize=50)
    private Long id;

Oracleシーケンスに関連する

CREATE SEQUENCE MY_SEQUENCE MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 50 NOCYCLE NOCACHE NOORDER;

show sql をオンにしてコードを実行すると、多くの挿入ステートメントにかなりの時間がかかっていることがわかります。

entityManager.flush(); entityManager.clear();挿入された50行ごとに呼び出す必要があることを読みました。

http://abramsm.wordpress.com/2008/04/23/hibernate-batch-processing-why-you-may-not-be-using-it-even-if-you-think-you-are/

これは、永続化を分割する必要があることを意味しますか?

entityManager.persist(instanceOfA);
instanceOfA.addB(instanceOfB);
entityManager.persist(instanceofB);

への 50 回の呼び出しごとにフラッシュ クリアを追加しpersist()ます。

それを行うよりクリーンな方法はありますか?(私の実際のオブジェクト階層には、A と B のような約 7 層の関係があります)

挿入にJDBCを使用することを考えていましたが、行マッパーを書くのは嫌いです:)

聞いたことorg.hibernate.StatelessSessionがありますが、ある時点で SessionFactory にキャストせずに JPA エンティティマネージャーからそれを取得する方法はありません-これもあまりきれいではありません。

前もって感謝します!

4

2 に答える 2

2

一括/大規模な挿入には純粋な JDBC を使用します。ORM フレームワークを使用しないでください。

于 2012-10-04T04:29:28.333 に答える