Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EntityManager.getResultList()上的性能缓慢_Java_Spring_Hibernate_Jpa_Entitymanager - Fatal编程技术网

Java EntityManager.getResultList()上的性能缓慢

Java EntityManager.getResultList()上的性能缓慢,java,spring,hibernate,jpa,entitymanager,Java,Spring,Hibernate,Jpa,Entitymanager,我们在web应用程序中使用Hibernate+Spring引导,但EntityManager在执行select查询时存在性能问题。查询应返回20行,并在DBArtisan中执行

我们在web应用程序中使用Hibernate+Spring引导,但EntityManager在执行select查询时存在性能问题。查询应返回20行,并在DBArtisan中执行<1s。但是,相同的查询在代码中执行9秒:

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());
CriteriaQuery totalCriteriaQuery=criteriaBuilder.createQuery(Long.class);
根totalRoot=totalCriteriaQuery.from(modelClass);
选择(criteriaBuilder.count(totalRoot));
if(searchCriteria!=null){
totalCriteriaQuery.where(whereBuilder.build(searchCriteria,criteriaBuilder,totalRoot));
}
TypedQuery totalQuery=em.createQuery(totalCriteriaQuery);
setFirstResult(pageRequest.getOffset());
setMaxResults(pageRequest.getPageSize());
秒表秒表=新秒表();
秒表。开始();
List resultList=contentQuery.getResultList();
秒表;
System.out.println(“纳秒:+stopWatch.getNanoTime());

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

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

如果您尝试过缓存查询,那么在使用Hibernate+Spring配置时也可能会有所帮助。如果你想提高你的表现,我建议你看看这个页面


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

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

如果您尝试过缓存查询,那么在使用Hibernate+Spring配置时也可能会有所帮助。如果你想提高你的表现,我建议你看看这个页面


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

在幕后,Criteria API使用偏移量和限制进行分页,但对于大偏移量值,则使用偏移量和限制

因此,页面越深入,查询速度就越慢,但这是关系数据库的一个缺点


您可以先使用和获取ID,然后使用ID获取实体。

在幕后,Criteria API使用偏移量和限制进行分页,但对于较大的偏移量值,则使用偏移量和限制

因此,页面越深入,查询速度就越慢,但这是关系数据库的一个缺点


您可以先使用和获取ID,然后再使用ID获取实体。

事实证明,我的实体有一个与另一个表的联接列,hibernate生成的实际查询包含多个子查询。我为该列提供了以下注释,一旦我更改为LAZY,它将按预期加快速度,但不确定更改FetchType意味着什么

 @ElementCollection(fetch = FetchType.EAGER)

事实证明,我的实体有一个与另一个表的联接列,hibernate生成的实际查询包含多个子查询。我为该列提供了以下注释,一旦我更改为LAZY,它将按预期加快速度,但不确定更改FetchType意味着什么

 @ElementCollection(fetch = FetchType.EAGER)

将SQL执行时间与HSQL和返回对象进行比较就是比较苹果和桔子。根据您的数据库,使用分页的速度非常慢,为什么使用分页呢?这是一个总是返回单个结果的计数。您可以发布在DBArtisan中运行的查询和JPA生成的查询吗。除非它们是完全不同的查询,否则在执行时间上应该有任何显著的差异。这是生成的JPA查询(为了在DBArtisan中运行,需要稍作修改):从dummytable中选择*作为generatedAlias0,其中generatedAlias0.final_decision是null order by generatedAlias0.id asc——它返回20行比较SQL执行时间和HSQL,返回的对象比较苹果和橙子。根据您的数据库,使用分页的速度非常慢,为什么使用分页呢?这是一个总是返回单个结果的计数。您可以发布在DBArtisan中运行的查询和JPA生成的查询吗。除非它们是完全不同的查询,否则在执行时间上应该有任何显著的差异。这是生成的JPA查询(为了在DBArtisan中运行,稍作修改):从dummytable中选择*作为generatedAlias0,其中generatedAlias0.final_decision是null order by generatedAlias0.id asc——它返回20行