2016-05-18 24 views
0

私はスプリング・バッチを使用してツリー状のエンティティを読み取り、変換し、JpaItemWriterを使用してOracleデータベースに書き込みます。私が意味するツリー状の実体について:OneToMany階層を持つSpringバッチ・バルク・インサート

class A { 
    @OneToMany 
    List<B> bList; 
} 

class B { 
    @OneToMany 
    List<C> cList; 
} 

class C { 
    @OneToMany 
    List<D> dList; 
} 

class D { 

} 

関係の大きさは、速い成長することができますが、ビジネス上の理由のために1つのトランザクションで一度に全体のエンティティを永続化するために必要とされます。この4レベル階層で私は知りたいと思っているバネJpaItemWriterを使ってトップダウン戦略でバルク挿入を呼び出すためのHibernate(JPA優先)アプローチを使用して、データベースへの1回の呼び出しですべての "B"エンティティを保持することは可能です次にすべての "C"エンティティなど、...デバッグログが表示されているごとに、各エンティティの1つの挿入の代わりに。助けを前にありがとう。

答えて

1

ORMを実装するためにHibernateを使用している場合は、となるはずです。

Hibernateのドキュメントは、バッチ処理に掘り下げていくぶんhereです。正しく設定されていれば、Hibernateは(各チャンクの最後の)flush()中にエンティティタイプごとに挿入と更新を注文しようとします。

<prop key="hibernate.jdbc.batch_size">50<!--or some other number--></prop> 
<prop key="hibernate.order_inserts">true</prop> 
<prop key="hibernate.order_updates">true</prop> 
<prop key="hibernate.jdbc.batch_versioned_data">true</prop> 

このRed Hat example靴をどのように永続性と同じことを行うには:

また、あなたは次のプロパティが設定されていると、あなたのIDのIDENTITYジェネレータを使用していないことを確認したいと思います単位。

今や、Hibernateには気になることがあるので、BatchingBatcherクラスのログをバンプして、実際に挿入をバッチアップしていることを確認してください。最後に、シーケンスを使用しないエンティティでsaveOrUpdate()メソッドを監視します。あなた自身のIDを定義していて、あなたのオブジェクトがセッションにまだ存在していない(それはない)場合、Hibernateは最初にかupdateが必要かどうかを判断するためにDBに対してselectを発行します。

+0

ありがとう@Dean。情報のために、私のバッチルーチンのコア処理は、プロパティを追加してからわずか11秒からわずか1秒です。 batch_sizeはすでに設定されていたので、値を100に上げました。もう一度お手伝いしてください:) – guilhermerama

+0

Nice!私はいつでも660xのパフォーマンスを向上させます –

関連する問題