2016-11-30 9 views
0

Hibernateに問題があります。問題は、クエリの一部が実行に時間がかかりすぎることです。 エンティティ "クライアント"の1つが、 "managementAddress"、 "correspondAddress"、 "buildingAddress"という異なるタイプのアドレスに対して、3つのリレーションシップ@OneToOneを別のエンティティ "アドレス"に持つことがわかりました。 「住所」のエンティティには、「クライアント」エンティティとの関係はありません。私は遅い負荷がこれらの関係から来ていることを理解しました。 @OneToOneの関係は丁寧に初期化されます。モデル関係を変更することはできません。誰かがどのように実行のスピードを上げることができるのだろうか?ありがとう。複数の@OneToOne関係でHibernateが非常に遅い

これは関係が「クライアント」エンティティで宣言されている方法です:

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

これはロード50「クライアント」のエンティティのために、Hibernateの統計からのサンプルです:

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を有効にしてご提案のための可能な – HRgiger

+0

おかげであれば、メインタイムチェックデータベースのログとプロファイルに手動でDBに実行することにより、一つ一つを通過します。私はそれを試み、Hibernateが複数のSelectステートメントを生成して各クライアントの3つのアドレスを取得するようです。このフェッチプロセスを最適化する方法がいくつかあるはずです。 –

答えて

0

マークそれ必要な場合にのみ、遅延ロードアドレスにFetchType.LAZYを追加します。

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

提案していただきありがとうございます。アドレスは非常に頻繁に使用されるので、それらをレイジーとしてマークしても、複数のページにロードする必要があります。このリレーションシップフェッチを最適化する方法があるのだろうか? –

+0

ORMにキャッシュを正しく設定すると、複数回ロードされることはありません。 – shazin

+0

ありがとうございます、キャッシングが大いに役立ちました。 –

関連する問題