簡體   English   中英

休眠:實體圖的n + 1和性能降低

[英]Hibernate: n+1 and slow performance with Entity Graph

我們對Hibernate 5進行了升級,此后我們開始遇到性能問題。

我們有幾個具有以下關聯的實體:

@Entity
@Table(name = "EVENT")
public class Event {
    @Id
    @Column(name = "ID")
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "LOCATION", referencedColumnName = "ID")
    private Location location;
}

@Entity
@Table(name = "LOCATION")
public class Location {
    @Id
    @Column(name = "ID")
    private Long id;
}

我們正在使用Criteria API從數據庫中獲取數據。

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Event> query = cb.createQuery(Event.class);
Root<Event> from = query.from(Event.class);
query.select(from).where(from.get("id").in(1, 2, 3));
TypedQuery<Event> tQuery = entityManager.createQuery(query);
tQuery.setMaxResults(1000);
tQuery.getResultList();

以前(第4版,舊的Criteria API),Hibernate生成了一個join語句,僅基於FetchType.EAGER提取了所有數據,但是使用Hibernate 5,它創建了多個附加查詢來獲取“位置”數據- N + 1問題。

現在,我們嘗試了JPA實體圖,但結果復雜。 我們能夠減少查詢的數量(現在沒有N + 1了),但是另一方面,系統的性能甚至更慢。

我的問題是:

  1. 還有什么其他方法可以消除N + 1查詢問題?
  2. 實體圖在什么情況下會對性能產生負面影響?

(我們使用SQL Server,Tomcat,Hibernate 5.2.10,Java8。)

為了獲得較早的fetching location data along with join in a single query中進行fetching location data along with join in a single query行為,可以通過添加fetch來實現

from.fetch("location", javax.persistence.criteria.JoinType.LEFT);

因此您的代碼如下所示:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Event> query = cb.createQuery(Event.class);
Root<Event> from = query.from(Event.class);
from.fetch("location", javax.persistence.criteria.JoinType.LEFT);
query.select(from).where(from.get("id").in(1, 2, 3));
TypedQuery<Event> tQuery = entityManager.createQuery(query);
tQuery.setMaxResults(1000);
tQuery.getResultList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM