0

Eclipse リンク 2.3 & Derby db でエンティティ マネージャー JPA を使用しています。10 個のエンティティを持つモデルがあり、エンティティごとに1000 レコードを保存する必要があります。このプロセスには約 70 秒かかります。10 個のエンティティを持つ同じモデルでテストしましたが、100 個のレコードでは、コミットのすべてのプロセスに約 1.2 秒かかりました。

ボトルネックは、entityManager.getTransaction().commit();すべてのデータを永続化した後に 1 回だけ実行することです。コミットは、すべてのプロセスから 95% 以上を占めます。JVMモニターを使用してコミットに飛び込むと、クラスの1つがほぼすべてのコミット時間に関与していることがわかります。クラスはorg.eclipse.persistence.mappings.ManyToManyMapping

http://www.eclipse.org/eclipselink/api/1.0/org/eclipse/persistence/mappings/ManyToManyMapping.html

私のエンティティとモデルは多対多の関係を持っていないか、多対多の注釈を使用していません.指数関数的な動作の理由は何ですか?

この 2 つのエンティティを削除すると、時間が 85% 短縮されることに気付きました

このエンティティの何が問題なのですか

カーディナリティ 1の人物から、カーディナリティ N のタイトル賞へのナビゲーションです。つまり、1 人の人物が多くの賞を受賞できます。

@javax.persistence.Entity
@javax.persistence.Table(name = "a3_Person")
public class Person {
    @javax.persistence.Id 
    @javax.persistence.Column(length = 20)    
    //// Id;
    private String person_id;
    public String getPerson_id() { return this.person_id; }
    public void setPerson_id(String person_id) { this.person_id = person_id; }

    @javax.persistence.Column(length = 30)    
    //// Name;
    private String person_name;
    public String getPerson_name() { return this.person_name; }
    public void setPerson_name(String person_name) { this.person_name = person_name; }

    //// Awards;
    private List<TitleAward> person_awards;
    public List<TitleAward> getPerson_awards() { return this.person_awards; }
    public void setPerson_awards(List<TitleAward> person_awards) { this.person_awards = person_awards; }

}




@javax.persistence.Entity
@javax.persistence.Table(name = "a3_TitleAward")
public class TitleAward {
    @javax.persistence.Id 
    @javax.persistence.Column(length = 20)    
    //// Id;
    private String titleaward_id;
    public String getTitleaward_id() { return this.titleaward_id; }
    public void setTitleaward_id(String titleaward_id) { this.titleaward_id = titleaward_id; }

    @javax.persistence.Column(length = 30)    
    //// Type;
    private String titleaward_type;
    public String getTitleaward_type() { return this.titleaward_type; }
    public void setTitleaward_type(String titleaward_type) { this.titleaward_type = titleaward_type; }

    @javax.persistence.Column(length = 30)    
    //// Category;
    private String Cateeheihbadc;
    public String getCateeheihbadc() { return this.Cateeheihbadc; }
    public void setCateeheihbadc(String Cateeheihbadc) { this.Cateeheihbadc = Cateeheihbadc; }

    @javax.persistence.Column()    
    //// Year;
    private String titleaward_year;
    public String getTitleaward_year() { return this.titleaward_year; }
    public void setTitleaward_year(String titleaward_year) { this.titleaward_year = titleaward_year; }

    @javax.persistence.Column()    
    //// Won;
    private Boolean titleaward_won;
    public Boolean getTitleaward_won() { return this.titleaward_won; }
    public void setTitleaward_won(Boolean titleaward_won) { this.titleaward_won = titleaward_won; }

    //// Person;
    private Person Pers_fhfgdcjef;
    public Person getPers_fhfgdcjef() { return this.Pers_fhfgdcjef; }
    public void setPers_fhfgdcjef(Person Pers_fhfgdcjef) { this.Pers_fhfgdcjef = Pers_fhfgdcjef; }

}
4

1 に答える 1

2

ここで概説されているパフォーマンスの最適化の数があります。

http://java-persistence-performance.blogspot.com/2011/06/how-to-improve-jpa-performance-by-1825.html

@JoinTable を使用する @OneToMany アノテーションにも ManyToManyMapping が使用されていますが、これを使用していますか? 一般に、プロファイルを正しくプロファイリングして理解することは難しいため、プロファイルが有効でない場合があります。

コード、SQL ログのサンプル、およびプロファイルを含めてください。EclipseLink PerformanceMonitor を有効にすることもできます。

http://www.eclipse.org/eclipselink/documentation/2.4/concepts/monitoring003.htmを参照して ください。

100 レコードに 1.2 秒しかかからない場合、おそらくプロセスを 100 のバッチに分割し、70 秒ではなく 12 秒を取得できます。70 年代は、何らかの n^2 の問題が発生しているようです。

于 2013-04-30T13:05:46.310 に答える