現在我正在使用JPA。我想知道的是:JPA映射的性能
我有很多表映射到對方。當我查看日誌時,我發現在一個簡單的查詢後,很多信息正從數據庫中提取出來。如果一次有很多查詢會發生什麼?或者它會正常工作?我如何提高性能?
現在我正在使用JPA。我想知道的是:JPA映射的性能
我有很多表映射到對方。當我查看日誌時,我發現在一個簡單的查詢後,很多信息正從數據庫中提取出來。如果一次有很多查詢會發生什麼?或者它會正常工作?我如何提高性能?
ORM框架附帶有一個開銷。因爲它的級別相當高,有時需要生成大量本地SQL查詢才能在一行或兩行JPQL或純粹的操作中獲得所需的結果。
但是,JPA使用兩個緩存 - L1和L2。一個在實體級別運行,另一個在PersistenceUnits級別運行。因此,您可能會看到生成了很多SQL查詢,但過了一段時間後,應該緩存一些數據。
如果您對性能不滿意,可以嘗試使用延遲加載的集合或自己獲取所需的數據(您可能對此問題感興趣Bozho's post)。
最後,如果您發現緩存沒有改善您的性能,並且手工製作的JPQL查詢沒有做好工作 - 您可以隨時恢復爲普通的SQL查詢。請注意,這些查詢繞過JPA緩存,並可能需要您在執行本機查詢(或在活動事務開始時調用它)之前執行一些刷新操作。
儘管您會選擇優化路線 - 首先在您的環境中測試它並回答自己是否需要此優化。做一些沉重的測試,性能測試等等。
「不成熟的優化是萬惡之源。」 D. Knuth
如果你真的有很多實體映射在一起,這可能確實會導致性能問題。這通常會是這樣的,如果你有很多的@OneToMany
或@ManyToMany
映射:
@Entity
public class A {
@OneToMany
private List<B> listB;
@ManyToMany
private List<C> listC;
@OneToMany
private List<D> listD;
...
}
但是有一兩件事你可以做的,是使用懶抓取。這意味着加載一個字段可能會被延遲,直到它第一次被訪問。你可以通過使用fetch
屬性實現這一點:
@Entity
public class A {
@OneToMany(fetch=FetchType.LAZY)
private List<B> listB;
@ManyToMany(fetch=FetchType.LAZY)
private List<C> listC;
@OneToMany(fetch=FetchType.LAZY)
private List<D> listD;
...
}
在上面的示例這意味着數組listB,listC,listD不會從數據庫中取出,直到第一個訪問列表。
延遲讀取的具體實現取決於您的JPA提供程序。
通過提高生產力,你的意思是性能,對不對? – flash
是的,性能 –