org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
Spring 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行ごとに呼び出す必要があることを読みました。
これは、永続化を分割する必要があることを意味しますか?
entityManager.persist(instanceOfA);
instanceOfA.addB(instanceOfB);
entityManager.persist(instanceofB);
への 50 回の呼び出しごとにフラッシュ クリアを追加しpersist()
ます。
それを行うよりクリーンな方法はありますか?(私の実際のオブジェクト階層には、A と B のような約 7 層の関係があります)
挿入にJDBCを使用することを考えていましたが、行マッパーを書くのは嫌いです:)
聞いたことorg.hibernate.StatelessSession
がありますが、ある時点で SessionFactory にキャストせずに JPA エンティティマネージャーからそれを取得する方法はありません-これもあまりきれいではありません。
前もって感謝します!