2016-11-30 73 views
0

我有Hibernate的問題非常緩慢。問題是某些查詢需要很長時間才能執行。 我發現,實體「客戶」之一,有3個關係@OneToOne到另一個實體「地址」 - 對不同類型的地址:「managementAddress」,「correspondenceAddress」和「buildingAddress」。在「地址」實體中,與「客戶」實體沒有關係。我發現緩慢加載來自這些關係。 @OneToOne關係被急切地初始化。我不允許改變模型關係。有沒有人有想法,我怎麼能提高執行速度?謝謝。休眠模式,多@OneToOne關係

這是關係是如何在「客戶」實體宣稱:

@OneToOne(optional=true) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
private Address managementAddress; 

這是從Hibernate的統計樣本,用於加載50「客戶」實體:

7248515 nanoseconds spent acquiring 51 JDBC connections; 
2583681 nanoseconds spent releasing 51 JDBC connections; 
43894536 nanoseconds spent preparing 203 JDBC statements; 
4106621728 nanoseconds spent executing 203 JDBC statements; 
0 nanoseconds spent executing 0 JDBC batches; 
0 nanoseconds spent performing 0 L2C puts; 
0 nanoseconds spent performing 0 L2C hits; 
0 nanoseconds spent performing 0 L2C misses; 
+0

如果是多個查詢啓用的persistence.xml show_sql並通過在主要時間檢查數據庫日誌手動DB執行和配置文件經過一個接一個,如果可能的 – HRgiger

+0

感謝您的建議。我試過了,看來Hibernate會生成多個Select語句來爲每個客戶端檢索3個地址。我想應該有一些方法來優化這個提取過程。 –

回答

0

將其標記將FetchType.LAZY僅在需要時延遲加載地址。

@OneToOne(optional=true, fetch=FetchType.LAZY) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
private Address managementAddress; 
+0

感謝您的建議。地址經常被使用,所以即使我將它們標記爲Lazy,我也必須將它們加載到多個頁面上。想知道是否有一種方法來優化這種關係獲取? –

+0

如果在ORM中正確配置緩存將不會多次加載。 – shazin

+0

謝謝,緩存幫助了很多。 –