【问题标题】:setMaxResults with huge tables uses too much memory带有巨大表的 setMaxResults 使用太多内存
【发布时间】:2014-11-20 23:54:43
【问题描述】:

我正在使用 Hibernate,我想执行这个查询:

SELECT s.executionTime, g.date, s.name
FROM SimulationStatsGroup g
LEFT JOIN SimulationStats s ON s.group_id = g.id
WHERE g.name = 'general'
ORDER BY g.date DESC
LIMIT 30

在此查询中,我必须对表和 1 个 SimulationStatsGroup 包含几个 SimulationStats

但是,对于 HQLLIMIT 会生成错误,因为 hibernate 不支持它。 所以我改用了setMaxResults(int),但是当我在日志中查找查询时,我发现根本没有LIMIT

这可能是因为Hibernate知道SimulationStatsGroup可以包含多个SimulationStats,因此它知道限制为30个结果不会返回30个SimulationStatsGroup,而是30行,如果我们假设 1 个 SimulationStatsGroup 中有 10 个 SimulationStats,这将给我 3 个 SimulationStatsGroup

所以,我可以理解为什么它会以这种方式工作,而不是我想要的方式。但是,这种执行查询的方式使我的应用程序崩溃,因为它使用了太多内存,因为我的表中有超过 100 万行,而且似乎 Hibernate 正在尝试将所有行放在一个列表。

我的问题是:有没有办法限制内存的使用以使我的应用程序保持活动状态并且只保留我的 30 个对象?

【问题讨论】:

  • 请提供您的实际代码。
  • 我猜 hibernate 可能会让你懒加载 SimulationStats。还请包括您如何将实体映射到表。我的意思是,我认为 hibernate 将首先执行查询,然后才会创建对象并用值填充它们(不确定,但这对我来说很有意义),所以你可能不得不告诉 hibernate 默认情况下不要加载你的统计信息.
  • 默认情况下,Postgres 驱动程序将完整的结果缓冲在内存中。你可以通过 JDBC API 来改变它,但我不知道你是否可以通过 Hibernate 来改变它:jdbc.postgresql.org/documentation/93/query.html

标签: java hibernate postgresql jpa hql


【解决方案1】:

对于非常大的表,我建议您使用the seek method,但它需要运行本机查询,并且每个数据库都有自己的限制行数的方式。

在您的情况下,您可以简单地运行两个查询而不是一个:

  • 第一个查询只返回父 ID:

    Session session = sessionFactory.openSession();
    Query query = session.createQuery("select ssg.id from SimulationStatsGroup ssg");
    query.setFirstResult(0);
    query.setMaxResults(10);
    List<Long> ids = query.list();
    
  • 然后你可以使用第二个查询来获取有孩子的父母:

    Session session = sessionFactory.openSession();
    Query query = session.createQuery("select ssg from SimulationStatsGroup ssg left join fetch ssg.simulationStats where ssg.id in (:ids) ");
    query.setParameterList("ids", ids);
    List<SimulationStatsGroup> simulationStatsGroups = query.list();
    

这样可以绕过 Hibernate 内存中父子分组限制。

【讨论】:

  • 我从没想过使用这样的 2 个查询。这工作正常,谢谢!
猜你喜欢
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2011-01-13
  • 2014-12-04
相关资源
最近更新 更多