【问题标题】:Slow Performance on EntityManager.getResultList()EntityManager.getResultList() 上的性能缓慢
【发布时间】:2016-01-27 06:08:35
【问题描述】:

我们在我们的 Web 应用程序中使用 Hibernate + Spring boot,我们在 EntityManager 执行选择查询时遇到了性能问题。查询应返回 20 行,并在 DBArtisan 中执行

CriteriaQuery<Long> totalCriteriaQuery = criteriaBuilder.createQuery(Long.class);
        Root<M> totalRoot = totalCriteriaQuery.from(modelClass);
        totalCriteriaQuery.select(criteriaBuilder.count(totalRoot));
        if (searchCriteria != null) {
            totalCriteriaQuery.where(whereBuilder.build(searchCriteria, criteriaBuilder, totalRoot));
        }
        TypedQuery<Long> totalQuery = em.createQuery(totalCriteriaQuery);
        contentQuery.setFirstResult(pageRequest.getOffset());
        contentQuery.setMaxResults(pageRequest.getPageSize());
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        List<M> resultList = contentQuery.getResultList();
        stopWatch.stop();
        System.out.println("Nano seconds: "+ stopWatch.getNanoTime());

我正在寻找有关使用 EM 的性能的原因或任何建议。

【问题讨论】:

  • 比较 SQL 执行时间和 HSQL 并返回对象是比较苹果和橘子。根据您的数据库使用分页非常慢,为什么还要使用分页它是一个计数,它总是变成一个结果。
  • 您能否发布您在 DBArtisan 中运行的查询以及 JPA 生成的查询。除非它们是完全不同的查询,否则执行时间应该有任何显着差异。
  • 这是生成的 JPA 查询(稍作修改以便在 DBArtisan 中运行): select * from dummytable as generatedAlias0 where generatedAlias0.final_decision is null order by generatedAlias0.id asc -- 它返回 20 行

标签: java spring hibernate jpa entitymanager


【解决方案1】:

如果您遇到性能不佳的问题,您应该尝试分析代码以了解性能问题的真正所在。我建议为此目的使用 JProfiler,它给出了非常清晰的结果,甚至报告调用者函数。

您是否尝试过缓存查询,因为您使用的是 Hibernate + Spring 配置,它在这里也可能有所帮助。如果您想提高性能JPA Performance Tuning,我建议您查看此页面。

附:根据我自己的经验,如果性能是您的首选,请尝试使用普通 JDBC 而不是 EM。

【讨论】:

    【解决方案2】:

    在幕后,Criteria API 使用 OFFSET 和 LIMIT 进行分页,而 don't scale 用于大偏移值。

    因此,您使用页面越远,查询就会变得越慢,但这是关系数据库的缺点。

    您可以使用 key-set pagination 并先获取 id,然后再使用它们来获取实体。

    【讨论】:

      【解决方案3】:

      原来我的实体有一个与另一个表的连接列,hibernate生成的实际查询包含多个子查询。我为该列添加了以下注释,一旦更改为 LAZY,它会按预期加速,但不确定更改 FetchType 的含义。

       @ElementCollection(fetch = FetchType.EAGER)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 2015-01-27
        • 2021-06-04
        • 2016-11-09
        相关资源
        最近更新 更多