2016-11-30 90 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

谢谢,缓存帮助了很多。 –