0

最近、EclipsLink 2.0 を使用していたときに、永続オブジェクトの実装でパフォーマンスのボトルネックの問題に遭遇しました。

より具体的には、次の実装を使用していました。

@Entity
@Table(name = "CUSTOMERS")
public class CustomerEntity implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private volatile Long id;

@Column(nullable = false, unique = true)
private String name;

private static final long  serialVersionUID = 6952530957072210017L;

private String custGroup;
private String address;
private String nameOfFirstPerson;
private String contactPerson;
private String phone;
private String fax;
private String email;
private String comments;
private String defaultCustomer;
private volatile boolean delayedPaymentAllowed;
private volatile long periodOfDelayedPaymentAllowed;
private volatile boolean restrictionsOnDelayedPayment;
private volatile double maxAmoutPemittedSom;
private volatile double maxAmoutPemittedYE;
private transient String salesPointName;

@Column(length=25483)
private HashMap<String, PriceItem> totalBalance;

@Column(length=25483)
private HashMap<String, PriceItem> totalBalanceUsd;

private transient boolean valueChanged = false;


@OneToMany(mappedBy = "supplier")
private Collection<PurchaseInvoiceEntity> purchaseInvoices;

@OneToMany(mappedBy = "receiver")
private Collection<SalesInvoiceEntity> salesInvoices;

@OneToMany(mappedBy = "payer")
private Collection<PayInSlipEntity> payInSlips;

@OneToMany(mappedBy = "recipient")
private Collection<PaymentOrderEntity> paymentOrders;

@OneToMany(mappedBy = "recipient")
private Collection<WriteOffEntity> writeOffs;

@ManyToOne()
private ResponsiblePersonForDebtEntity responsiblePersonForDebt;

@ManyToOne
private CustomerGroupEntity customerGroup;


public CustomerEntity() {

    valueChanged = false;
}
...
}

新しいドキュメントのインスタンスを適切なコレクションに追加するたびに、ドキュメントの新しいインスタンスをテーブルに挿入するときに、ドキュメントの挿入に時間がかかりすぎることがわかりました。netbeans ide 6.9 のプロファイラー モジュールを使用しているときに、この問題に遭遇しました。実際、私はこれらのコレクションを使用して、関連ドキュメントの空をチェックしていました。

4

2 に答える 2

0

JPAのパフォーマンスとスケーラビリティの問題については、GordonYorkeによるS「高度にスケーラブルなJavaPersistenceアプリケーションの戦略とベストプラクティス」を読んだり聞いたりしてください。

于 2012-10-05T13:15:21.910 に答える
0

この問題に取り組むために、私は単に次の解決策を適用しました:

  1. ドキュメント参照を削除しただけです:

    @OneToMany(mappedBy = "supplier") プライベート コレクション purchaseInvoices;

    @OneToMany(mappedBy = "receiver") プライベート コレクション salesInvoices;

    @OneToMany(mappedBy = "payer") プライベート コレクション payInSlips;

    @OneToMany(mappedBy = "recipient") プライベート コレクション paymentOrders;

    @OneToMany(mappedBy = "recipient") プライベート コレクション writeOffs;

CusotmerEntity から:

 @Entity

@Table(name = "CUSTOMERS") public class CustomerEntity は Serializable を実装します {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private volatile Long id;
@Column(nullable = false, unique = true)
private String name;
private static final long serialVersionUID = 6952530957072210017L;
private String custGroup;
private String address;
private String nameOfFirstPerson;
private String contactPerson;
private String phone;
private String fax;
private String email;
private String comments;
private String defaultCustomer;
private volatile boolean delayedPaymentAllowed;
private volatile long periodOfDelayedPaymentAllowed;
private volatile boolean restrictionsOnDelayedPayment;
private volatile double maxAmoutPemittedSom;
private volatile double maxAmoutPemittedYE;
private transient String salesPointName;
@Column(length = 25483)
private HashMap<String, PriceItem> totalBalance;
@Column(length = 25483)
private HashMap<String, PriceItem> totalBalanceUsd;
private transient boolean valueChanged = false;
@ManyToOne()
private ResponsiblePersonForDebtEntity responsiblePersonForDebt;
@ManyToOne
private CustomerGroupEntity customerGroup;

public CustomerEntity() {

    valueChanged = false;
}
 .....}
  1. ドキュメントの参照を確認しているときに、CustomerEntity の編集または削除中に JPA クエリを使用しました。

この単純な変更により、最も影響の大きいパフォーマンスの問題が取り除かれました。

サイドノート:

パフォーマンス プロファイラーの使用中に、パッケージ メソッドのチェックも含めてください (例の eclipslink)。

于 2012-07-20T09:40:37.427 に答える