2012-04-30 102 views
1

現在我正在使用JPA。我想知道的是:JPA映射的性能

我有很多表映射到對方。當我查看日誌時,我發現在一個簡單的查詢後,很多信息正從數據庫中提取出來。如果一次有很多查詢會發生什麼?或者它會正常工作?我如何提高性能?

+0

通過提高生產力,你的意思是性能,對不對? – flash

+0

是的,性能 –

回答

1

ORM框架附帶有一個開銷。因爲它的級別相當高,有時需要生成大量本地SQL查詢才能在一行或兩行JPQL或純粹的操作中獲得所需的結果。

但是,JPA使用兩個緩存 - L1和L2。一個在實體級別運行,另一個在PersistenceUnits級別運行。因此,您可能會看到生成了很多SQL查詢,但過了一段時間後,應該緩存一些數據。

如果您對性能不滿意,可以嘗試使用延遲加載的集合或自己獲取所需的數據(您可能對此問題感興趣Bozho's post)。

最後,如果您發現緩存沒有改善您的性能,並且手工製作的JPQL查詢沒有做好工作 - 您可以隨時恢復爲普通的SQL查詢。請注意,這些查詢繞過JPA緩存,並可能需要您在執行本機查詢(或在活動事務開始時調用它)之前執行一些刷新操作。

儘管您會選擇優化路線 - 首先在您的環境中測試它並回答自己是否需要此優化。做一些沉重的測試,性能測試等等。

「不成熟的優化是萬惡之源。」 D. Knuth

1

如果你真的有很多實體映射在一起,這可能確實會導致性能問題。這通常會是這樣的,如果你有很多的@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提供程序。