gpt4 book ai didi

java - 带有大表的 setMaxResults 使用太多内存

转载 作者:行者123 更新时间:2023-11-29 13:02:00 28 4
gpt4 key购买 nike

我正在使用 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 行,这将给我 3 SimulationStatsGroup如果我们假设有 10 个 SimulationStats在 1 SimulationStatsGroup .

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

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

最佳答案

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

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

  • 第一个查询只返回父 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 内存中的父子分组限制。

关于java - 带有大表的 setMaxResults 使用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27051866/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com