多级数据集的休眠性能问题

Posted

技术标签:

【中文标题】多级数据集的休眠性能问题【英文标题】:Hibernate performance issue with multi level data set 【发布时间】:2013-05-05 07:28:39 【问题描述】:

我有以下一组数据:

Class-
      |- Section
      |         |- Student1
      |         |         |-Day1Details
      |         |         |-Day2Details   
      |         |- Student2
      |         |         |-Day1Details
      |         |         |-Day2Details  
      |- Section
                :
                :

我正在使用 Hibernate ORM 将上述示例数据保存到数据库中。当我们尝试检索此数据时,休眠分别为每个学生执行查询。因此,如果有 1000 个学生,它将触发 1000 个查询来获取整个数据集,并且由于对 DB 的大量 i/o,它会影响应用程序的性能。

我希望在以下几个查询中收集这些数据。

select class,section, students from c,s,stu where student.sec=s.sec and s.class = c.class

select day_details from day_details_tab where student in (studentId from above query).

有人可以帮助我实现这一目标吗?

【问题讨论】:

奇怪的是,它只在日详细信息级别执行单独的查询。其余数据通过连接获取... 【参考方案1】:

the documentation 中描述了 HQL 中连接和关联的用法。一次加载所有内容的正确查询是:

 select clazz from Clazz clazz
 left join fetch clazz.sections section
 left join fetch section.students student
 left join fetch student.dayDetails

HQL 使用实体和关联。切勿像在问题中那样使用表名和列名。

【讨论】:

如果数据量大,在数据库端一次加入所有数据也可能会影响数据库服务器的性能... 我想如何在两个不同的查询中运行它。 所以你认为使用两个查询加载相同的数据比只使用一个查询对性能的影响要小?没有多大意义。无论如何,您正在预先优化,这是万恶之源。仅当您有已证明的性能问题并且可以证明问题来自查询时才进行优化。无论如何,我已经向您展示了如何编写第一个查询。写第二个应该很容易。

以上是关于多级数据集的休眠性能问题的主要内容,如果未能解决你的问题,请参考以下文章

你知道如何用多级缓存提升秒杀系统的服务性能吗

Firebase 与大型数据集的性能

多级缓存:架构设计中提升性能最直接的方式

连接查询的休眠性能问题

使用数据透视表关系提高大型数据集的性能(使用 Laravel)

OneToMany /可为空关系的休眠性能问题