当前位置: 首页 > 知识库问答 >
问题:

Spring仓库findAll()太慢

韦志新
2023-03-14

我在新的spring boot应用程序中遇到了一个奇怪的缓慢现象,当我获取一个表用于报告时。

这是一个简单的表,没有对其他表的引用,它有5列。行数为50k。因此,我使用了简单的findAll()方法,该方法在JpaRepository中提供。

当“目标”结果是实体时,findAll()执行需要5分钟。当我设置DTO类投影或接口投影时,执行需要1-2分钟。

我相信对于那么多的数据来说,这仍然太多了。

此外,hibernate统计提供了0.5秒的执行时间。在剩下的1-2分钟内,如何获取DTO类型的数据?

共有3个答案

邓禄
2023-03-14

我有一个类似的问题,Spring数据在执行select之前在我的表上执行select count(*)。为了避免这种情况,我重写了count()

这可能对你的具体情况有帮助,也可能没有帮助。

import org.springframework.data.jpa.repository.JpaRepository;

public interface MyRepository extends JpaRepository<MyEntity,Integer> {
    

    @Override
    default long count(){
        //counts on very large tables take forever. Optionally add this
        return 0;
    }
}

在我的例子中,选择计数(*)的解释计划很大,手动运行查询时看起来很长时间。

explain select count(*) from MY_TABLE
史鸿运
2023-03-14

当然,序列化/反序列化过程非常繁琐,需要太多内存。你可以为此做很多事情:

  • 增加应用程序的内存参数。请参阅JVM内存选项。

通过分页示例,您可以在spring boot应用程序中快速显示数据集:

public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> {

    List<Product> findAllByPrice(double price, Pageable pageable);
}

起始点代码来自https://www.baeldung.com/spring-data-jpa-pagination-sorting,以及您可以遵循的说明,以使其运行良好。

戴浩初
2023-03-14

@Benda给出了很好的指针,连接jvisualvm并使用CPU评测来查看花费的时间。由于行的数量很大,驱动程序通常会进行多次往返以获取大量数据,以避免出现内存不足的情况,并且在hibernate加载这些行时,会将其累积到一级缓存中。我曾经遇到一个场景,其中事务没有标记为readonly,因此在最后Hibernate尝试进行脏检查,以查看是否有更改。我还建议您集成Javamelody。它是免费的,开源的,并且非常容易用Spring Boot安装(只需在构建中包含一个依赖项)。它可以通过服务级别详细信息和SQL计时告诉您在每个用例中花费的时间——所有这些都有一个良好的可视化仪表板。

 类似资料:
  • 我正在努力让Spring JPA Data为我工作,但一直在努力。问题出在这里。 我有两个域类,它们之间有一个简单的一对多关系: 我已经为每个类设置了存储库接口:CardRepository,扩展JpaRepository的用户存储库,两个存储库都注入到服务中 非常基本的设置。someMethod() 出现问题,其中我用它的标识符查询了一个用户,然后尝试获取映射@OneToMany的列表,然后发生

  • 在使用Spring数据存储库时发现一些奇怪的行为。 我写了这些类和接口: 当我尝试测试UserRepositoryImpl时,java。lang.StackOverflowerr被抛出 我发现save()方法存在一些问题。此外,delete()方法会引发stackoverflow。 我已经找到了解决办法。当我更改将存储库接口扩展为(例如)JpaUserRepository的接口的名称时,我的问题就

  • 29.3.2 Spring Data JPA仓库 Spring Data JPA仓库是可以定义用于访问数据的接口。JPA的查询是根据方法名称自动创建的。例如,CityRepository接口可能会定义一个findAllByState(String state)方法来查找某个州的全部城市。 对于更复杂的查询,您可以使用Spring Data的Query对方法进行注解。 Spring Data仓库通常

  • Repository,仓库,简称 Repo。为项目添加一个 Git 仓库以后,你就可以用 Git 为项目做版本控制了。 git init 上面的命令可以为项目初始化一个仓库,这个动作只需要执行一次,它会在项目下面创建一个 .git 目录,Git 会把它需要的东西存储在这个 .git 目录里面,它其实就是项目的仓库。 练习 1,创建一个项目。打开你的命令行界面,执行: cd ~/desktop m

  • 仓库(Repository),这里指的是可以使用包管理工具安装的软件包的列表。系统自带一些仓库,如果你发现要安装的包在这些仓库里不存在,你可能需要在系统上安装额外的仓库。 仓库列表 先查看一下安装在系统上的仓库列表,执行: yum repolist 返回类似的东西: repo id repo name

  • 镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。 一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的