0

144 レコード (行) を含むタスク テーブルがあります。通常の選択クエリを使用してすべてのレコードをフェッチしていますが、JProfiler によって報告されたメソッドにかかる時間は、この少量のデータには長すぎます。

これがJProfilerのスナップショットです。

私の懸念は、 org.hibernate.impl.QueryImpl.listにかかる時間です。データベース ツールで通常の SQL クエリを実行すると、すべてのレコードを取得するのに 0.016 秒かかりますが、ここではさらに時間がかかります。

この時間をどのように短縮できますか? これは本当に削減できますか?または約3秒でいいですか?

使用するデータベースはMySqlです。

以下は、日付を取得するメソッドです

public List<Backlog> findBacklogList() {
    Query query = (Query) getSession().createQuery("from Backlog");
    List<Backlog> backlogList = (List<Backlog>) query.list();
    return backlogList;
}

以下はバックログポジョです

public class Backlog implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private Long taskId;
private String taskName;
private TaskType taskType;
private Member createdBy; // String
private Date createdDate;
private Member updatedBy; // String
private Date updatedOn;
private Status status;
private Priority priority;
private String approved;
private Member completedBy;
private Member ownedBy;
private BacklogGroup group;
private Set<OtherPeople> otherPeople;
private String activeStatus;
private String statusChanged;
private String description;
private Date expectedEndDate;

/**
 * @return the taskId
 */
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "taskid", nullable = false, unique = true, insertable = false)
public Long getTaskId() {
    return taskId;
}

/**
 * @param taskId
 *            the taskId to set
 */
public void setTaskId(Long taskId) {
    this.taskId = taskId;
}

/**
 * @return the taskName
 */
@Column(name = "taskname", nullable = false, unique = true)
public String getTaskName() {
    return taskName;
}

/**
 * @param taskName
 *            the taskName to set
 */
public void setTaskName(String taskName) {
    this.taskName = taskName;
}

/**
 * @return the taskType
 */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "tasktype", referencedColumnName = "id", nullable = false)
public TaskType getTaskType() {
    return taskType;
}

/**
 * @param taskType
 *            the taskType to set
 */
public void setTaskType(TaskType taskType) {
    this.taskType = taskType;
}

/**
 * @return the createdDate
 */
@Column(name = "createdDate", nullable = false)
public Date getCreatedDate() {
    return createdDate;
}

/**
 * @param createdDate
 *            the createdDate to set
 */
public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}

/**
 * @return the updatedBy
 */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "updatedBy")
public Member getUpdatedBy() {
    return updatedBy;
}

/**
 * @param updatedBy
 *            the updatedBy to set
 */
public void setUpdatedBy(Member updatedBy) {
    this.updatedBy = updatedBy;
}

/**
 * @return the updatedOn
 */
@Column(name = "updatedOn")
public Date getUpdatedOn() {
    return updatedOn;
}

/**
 * @param updatedOn
 *            the updatedOn to set
 */
public void setUpdatedOn(Date updatedOn) {
    this.updatedOn = updatedOn;
}

/**
 * @return the status
 */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "status", referencedColumnName = "id", nullable = false)
public Status getStatus() {
    return status;
}

/**
 * @param status
 *            the status to set
 */
public void setStatus(Status status) {
    this.status = status;
}

/**
 * @return the priority
 */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "priority", referencedColumnName = "id", nullable = false)
public Priority getPriority() {
    return priority;
}

/**
 * @param priority
 *            the priority to set
 */
public void setPriority(Priority priority) {
    this.priority = priority;
}

/**
 * @return the approved
 */
@Column(name = "approved")
public String getApproved() {
    return approved;
}

/**
 * @param approved
 *            the approved to set
 */
public void setApproved(String approved) {
    this.approved = approved;
}

/**
 * @return the completedBy
 */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "completedBy")
public Member getCompletedBy() {
    return completedBy;
}

/**
 * @param completedBy
 *            the completedBy to set
 */
public void setCompletedBy(Member completedBy) {
    this.completedBy = completedBy;
}

/**
 * @return the otherPeople
 */
@OneToMany(mappedBy = "task", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public Set<OtherPeople> getOtherPeople() {
    return otherPeople;
}

/**
 * @param otherPeople
 *            the otherPeople to set
 */
public void setOtherPeople(Set<OtherPeople> otherPeople) {
    this.otherPeople = otherPeople;
}

/**
 * @return the group
 */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "groupid", referencedColumnName = "id", nullable = false)
public BacklogGroup getGroup() {
    return group;
}

/**
 * @param group
 *            the group to set
 */
public void setGroup(BacklogGroup group) {
    this.group = group;
}

/**
 * @return the createdBy
 */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "createdBy", nullable = false)
public Member getCreatedBy() {
    return createdBy;
}

/**
 * @param createdBy
 *            the createdBy to set
 */
public void setCreatedBy(Member createdBy) {
    this.createdBy = createdBy;
}

/**
 * @return the activeStatus
 */
@Column(name = "activeStatus")
public String getActiveStatus() {
    return activeStatus;
}

/**
 * @param activeStatus
 *            the activeStatus to set
 */
public void setActiveStatus(String activeStatus) {
    this.activeStatus = activeStatus;
}

/**
 * @return the statusChanged
 */
@Column(name = "statusChanged")
public String getStatusChanged() {
    return statusChanged;
}

@Column(name = "expectedEndDate")
public Date getExpectedEndDate() {
    return expectedEndDate;
}

public void setExpectedEndDate(Date expectedEndDate) {
    this.expectedEndDate = expectedEndDate;
}

/**
 * @param statusChanged
 *            the statusChanged to set
 */
public void setStatusChanged(String statusChanged) {
    this.statusChanged = statusChanged;
}

/**
 * @return the description
 */
@Column(name = "description", length = 5000)
public String getDescription() {
    return description;
}

/**
 * @param description
 *            the description to set
 */
public void setDescription(String description) {
    this.description = description;
}

/**
 * @return the ownedBy
 */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ownedBy", nullable = false)
public Member getOwnedBy() {
    return ownedBy;
}

/**
 * @param ownedBy the ownedBy to set
 */
public void setOwnedBy(Member ownedBy) {
    this.ownedBy = ownedBy;
}

/*
 * (non-Javadoc)
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((taskId == null) ? 0 : taskId.hashCode());
    return result;
}

/*
 * (non-Javadoc)
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (!(obj instanceof Backlog)) {
        return false;
    }
    Backlog other = (Backlog) obj;
    if (taskId == null) {
        if (other.taskId != null) {
            return false;
        }
    } else if (!taskId.equals(other.taskId)) {
        return false;
    }
    return true;
}

}

4

2 に答える 2

0

私の推測では、クエリは関連するすべてのデータも取得していると思います。たとえば、otherPeople セットは大きい可能性があります。どのステートメントが実際に実行されているかを確認するために、休止状態の SQL ロギングを有効にしてみてください。各結果行 (または複数行) に対して個別のサブクエリを取得している場合は、問題が発生する可能性があります。データが必要になることがわかっている場合は、データがすぐに結合されるように、積極的にフェッチしたり、FetchJoin にリレーションを設定したりしないことを検討してください。データが必要ない場合は、選択しないでください。多数の結果に関心があるが、その中のデータの小さなサブセットのみに関心がある場合 (概要リストなど) は、クエリのためだけに追加のオブジェクトを作成することをお勧めします。

于 2013-04-11T05:57:11.093 に答える
0

Hibernate の使用中にデータのフェッチに必要な時間を短縮する最初のことは、可能な限り遅延読み込みを使用することです。

@ManyToOne(fetch = FetchType.EAGER)// This will take more time 

可能であれば、pojo で EAGER 読み込みを LAZY に変更します。

@ManyToOne(fetch = FetchType.LAZY)

もう 1 つは、Hibernate によって実行されたクエリの出力を有効にすることです。単一のオブジェクトを取得するために実行された実際のクエリの数を確認できます。

これを行うには、休止状態の構成で hibernate.show_sql プロパティを true に設定します。

<property name="show_sql">true</property>

休止状態の最適化の詳細については、こちらを参照してください。

于 2013-04-11T07:00:12.287 に答える