如何使用 Spring Boot(服务器端)和 Angular(前端)将 100K 数据加载到表中

Posted

技术标签:

【中文标题】如何使用 Spring Boot(服务器端)和 Angular(前端)将 100K 数据加载到表中【英文标题】:How to load 100K data to a table with spring boot( server side) and Angular (front end) 【发布时间】:2019-09-01 18:22:54 【问题描述】:

我在不延迟客户端的情况下从后端加载数据时遇到问题..我使用 spring boot 作为后端,使用 angular 7 作为前端..问题是当我从前端提交请求时从后端加载所有数据加载数据需要 55 秒。等待太久了..我想知道有什么想法可以更快地完成这个过程..

我已经完成了从后端到前端加载数据的所有编码。从后端到前端加载数据没有任何错误或任何问题。但问题是加载时间太长了想要加快这个过程

这是 application.properties 文件

spring.datasource.url = jdbc:mysql://localhost:3306/siri?createDatabaseIfNotExist=true
spring.datasource.username = root
spring.datasource.password =sanu
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL57Dialect
spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=2KB
spring.servlet.multipart.max-file-size=200MB
spring.servlet.multipart.max-request-size=215MB

这是我的实体

@Entity
@Table(name = "Parts")
public class Parts implements SuperEntity 
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "map")
    @TableGenerator(name = "map", table = "Id_Gen", pkColumnName = 
   "Tables_Names", valueColumnName = "Gen_keys", pkColumnValue = 
   "PartsDTO", initialValue = 1, allocationSize = 1)
    private int id;
    private String partName;
    private String partNumber;
    private String barCode;
    private String brand;
    private String partType;
    private String country;
    private String vehicleModel;
    private String packSize;
    private String location;
    private String rackNo;
    private String roq;
    private String rql;
    @Column(name = "imageUrl1")
    private String imageUrl1;
    @Column(name = "imageUrl2")
    private String imageUrl2;
    @Column(name = "imageUrl3")
    private String imageUrl3;
    @Column(name = "imageUrl4")
    private String imageUrl4;
    private Blob image;
    private Blob image1;
    private Blob image2;
    private Blob image3;
    private String warranty;
    private Date adedDate;
    @Enumerated(value = EnumType.STRING)
    private Catogary catogary;
    @ManyToMany(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
    @JoinTable(name = "Parts_FuelType",
            joinColumns = @JoinColumn(name = "part_ID", 
    referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "fuel_Type", 
    referencedColumnName = "id"))
    private List<FuelType> fuelTypes = new ArrayList<>();
    @OneToMany(mappedBy = "parts", cascade = CascadeType.DETACH, fetch = 
    FetchType.LAZY)
    private List<OrderDetails> orderDetail = new ArrayList<>();
    @OneToMany(mappedBy = "parts", cascade = CascadeType.DETACH, fetch = 
    FetchType.LAZY)
    @OrderBy("date DESC")
    private List<Bulk> bulks = new ArrayList<>();

这是 Crud 回购

public interface PartsRepo extends CrudRepository<Parts, Integer> 
    Parts findPartsByBarCode(String barCode) throws Exception;
    List<Parts> findPartsByPartNameContaining(String partName) throws Exception;
    List<Parts> findPartsByPartNumberContaining(String partNumber) throws Exception;
    Long countByBarCodeAndFuelTypes(String barCode, FuelType t) throws Exception;
    Parts findPartsByPartNumber(String partNumber) throws Exception;

这是控制器

@GetMapping(value = "/getAll")
public List<PartsDTO> getAllParts() 
    try 
        return partsService.getAllParts();
     catch (Exception e) 
        e.printStackTrace();
        return null;
    

从这里将所有数据加载到前端 html 表需要将近 1 分钟我想知道将所有数据 (100K) 数据快速加载到 html 表的最快方法是什么

【问题讨论】:

您必须为您的数据添加分页,不应一次请求全部加载 当你有很多数据要显示时,你需要使用分页。您已经是,但这是客户端分页,这意味着 Angular 需要处理 所有记录 并将它们分页,这非常慢。你应该做分页服务器端。 那么请解释一下如何在spring boot中进行服务器端分页 【参考方案1】:

如果您需要加载 10 万条记录,您确实应该添加服务器端分页。

Spring-Boot 允许您开箱即用地创建分页。

您的repository 应该扩展PagingAndSortingRepository

public interface PartsRepo extends PagingAndSortingRepository<Parts, Integer> 
    Page<Parts> getAllPartsPage(Pageable pageable, //whatever @Param you need here);

你的controller 应该接受Pageable 参数:

@GetMapping(value = "/getAll")
public Page<PartsDTO> getAllPartsPageable(@SortDefault("id (or whatever field you need)") Pageable pageable) 
    try 
        return partsService.getAllPartsPage();
     catch (Exception e) 
        e.printStackTrace();
        return null;
    

结帐Pageable接口description。

另外,这里有一个很好的 article 关于 spring-boot 分页。

【讨论】:

以上是关于如何使用 Spring Boot(服务器端)和 Angular(前端)将 100K 数据加载到表中的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot构建的Web项目如何在服务端校验表单输入

如何使用 CAS 针对 Spring Boot 后端授权 Angular 5 应用程序

如何使用 Spring Boot jwt 将身份验证系统连接到 React.js

如何使用 React 前端和 Spring Boot 安全后端进行客户端身份验证检查?

Spring Boot框架下实现Excel服务端导入导出

在 spring-boot 中如何分离前端和后端机器?