Как загрузить 100 Тыс. данных в таблицу с помощью spring boot (на стороне сервера) и Angular (интерфейс)

#java #angular #spring #spring-boot #spring-mvc

#java #angular #spring #spring-boot #spring-mvc

Вопрос:

у меня проблема с загрузкой данных из серверной части в исходную без задержки на стороне клиента .. я использую 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 Repo

 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;
    }
}
  

исходя из этого, требуется почти 1 минута для загрузки всех данных во внешнюю HTML-таблицу. я хочу знать, какой самый быстрый способ быстро загрузить все данные (100 Тыс.) в таблицу html

введите описание изображения здесь

Комментарии:

1. вы должны добавить подкачку для своих данных, не следует загружать все в одном запросе

2. Когда у вас много данных для отображения, вам нужно использовать подкачку. Вы уже это сделали, но это подкачка на стороне клиента, что означает, что angular необходимо обрабатывать все записи и размещать их на странице, что происходит очень медленно. Вы должны выполнять подкачку на стороне сервера.

3. тогда, пожалуйста, объясните мне, как выполнить подкачку на стороне сервера в spring boot

Ответ №1:

Вам действительно следует добавить подкачку на стороне сервера, если вам нужно загрузить 100 тыс. записей.

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 Описание интерфейса оформления заказа.

Кроме того, вот хорошая статья о разбиении на страницы при загрузке с помощью spring.