他のエンティティにリンクするエンティティプロパティを更新すると、eclipselinkで一括書き込みに問題があります。JPA/Eclipselink ManyToOneリレーションシップの変更でパフォーマンスが悪いバッチ更新エンティティ
カードエンティティと@ManyToOneの関係を持つカード所有者エンティティを持っています。
@Entity
@Table(name = "...")
@NamedQueries({...})
public class Cardholder implements Serializable {
...
@JoinColumn(name = "card_number", referencedColumnName = "...")
@ManyToOne(fetch=FetchType.LAZY)
private Card card;
}
と私はすでに子供のリスト(カード会員を永続化)を持っているカード保有者
@Entity
@Table(name = "cms_card")
@NamedQueries({...})
public class Card implements Serializable {
@OneToMany(mappedBy = "card")
private List<Cardholder> cardholderList;
}
と@OneToMany関係にカード。今度はカードを に追加します: // cardholderListは管理対象エンティティリストです。
for (Cardholder cardholder : cardholderList) {
Card newCard = new Card();
...
cardholder.setCard(newCard);
List<Cardholder> cardCardholders = new ArrayList<Cardholder>();
cardCardholders.add(cardholder);
newCard.setCardholderList(cardCardholders);
cardsToBePersisted.add(newCard);
++i;
}
Iは、バッチ書き込みを使用するために私のpersistence.xmlを構成しますが、パフォーマンスは+ -15000リストの更新のために恐ろしく遅いです。
FINER: Begin batch statements
FINE: INSERT INTO cms_card (card_number, status, chip_serial_number, dwh_status, valid_until, card_holder_id, file_perso_history_id, feedback_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
FINE: bind => [9030002005890011, ACTIVE, null, false, 2015-12-10, null, 241, null]
FINER: End Batch Statements
FINER: Begin batch statements
FINE: UPDATE cms_cardholder SET card_number = ? WHERE (id = ?)
FINE: bind => [9030002005890011, 176075]
FINER: End Batch Statements
FINER: Begin batch statements
FINE: INSERT INTO cms_card (card_number, status, chip_serial_number, dwh_status, valid_until, card_holder_id, file_perso_history_id, feedback_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
FINE: bind => [9030002005889908, ACTIVE, null, false, 2015-12-10, null, 241, null]
FINER: End Batch Statements
私は、既存の子供たちに新しい親プロパティ(カード)を設定しているため、これがあると思う:私は、生成されたSQLにチェックしたときに今、私はEclipseLinkは、そのような、1つのクエリの1つのバッチを作成していることがわかりました。
私は親子関係(カード - >カード所有者の代わりにカード保有者 - >カード)を逆にしてプレイしようとします。 エンティティとデータベースの関係を逆にしてもバッチインサートは正しいですが、Eclipselinkはデータベース(SELECT * from cardholder.id =?)を照会するので、15000レコードの場合は15000 select文が得られます。上記より優れていますが、依然として非常に遅いです。
バッチ書込みの設定に間違いがありますか? ありがとうございます。
EntityManagerコードも投稿できますか?いつでもem.flush()を発行していますか? –