#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.