在我的控制器中,im使用CrudRepository方法findAll()来查找数据库中的所有用户,如下所示:

userRepository.findAll()


问题是这样做需要花费1.3分钟才能加载1.500个用户。从那里,我用Thymeleaf将数据加载到模型中,并在html表中显示:每个用户的姓名,创建时间,电子邮件,id,数据包和状态。有什么办法可以提高性能或解决我的问题吗?
任何帮助将不胜感激。

这是我的用户实体

    @Id
    @SequenceGenerator(name = "user_id_generator", sequenceName = "user_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_generator")
    private Long id;
    @Column(nullable = false, unique = true)
    private String email;
    @Column(name = "uuid", nullable = false, unique = true)
    private String uuid;
    @Column(name = "reset_pwd_uuid", unique = true)
    private String resetPwdUuid;
    @Column(nullable = false)
    private String password;
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Status status;
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Packet packet = Packet.BASE;
    @Enumerated(EnumType.STRING)
    @Column
    private Situation situation;
    @Column(nullable = false, name = "numberOfSomething")
    private Integer apples;
    @Column(nullable = false, name = "numberOfSomethingElse")
    private Integer oranges;
    @Column(name = "time_created")
    private Timestamp timeCreated;

    @OneToMany(mappedBy = "user", cascade = {CascadeType.REMOVE})
    @LazyCollection(LazyCollectionOption.FALSE)
    @OrderBy("rank ASC")
    private List<Person> person;

    @OneToMany(mappedBy = "user", cascade = {CascadeType.REMOVE})
    @LazyCollection(LazyCollectionOption.FALSE)
    @OrderBy("timeOccured ASC")
    private List<History> history;

    @OneToMany(mappedBy = "user", cascade = {CascadeType.REMOVE})
    @LazyCollection(LazyCollectionOption.FALSE)
    @OrderBy("id ASC")
    private List<Invoice> invoices;

    @OneToOne(mappedBy = "user", cascade = {CascadeType.REMOVE})
    private Building building;

    @OneToOne(mappedBy = "user", cascade = {CascadeType.REMOVE})
    private House house;

    @OneToOne(mappedBy = "user", cascade = {CascadeType.REMOVE})
    private Car car;

    @OneToOne(mappedBy = "user", cascade = {CascadeType.REMOVE})
    private Street street;

    @OneToOne(mappedBy = "user", cascade = {CascadeType.REMOVE})
    private Moreof moreof;

    @JoinColumn(name = "basedata_id", referencedColumnName = "id")
    @ManyToOne(cascade = {CascadeType.REMOVE})
    private Basedata basedata;

    @Column(name = "family")
    private String family;

    @Column(name = "unkle_mail")
    private boolean unkleMail;

    @Column(name = "vacation")
    private LocalDate vacationUntil;

    @Column(name = "ordered")
    private boolean ordered;

    @Column(name = "shipped")
    private boolean shipped;

    @Transient
    private boolean isEdit;

    @Transient
    private boolean one;
    @Transient
    private boolean two;
    @Transient
    private boolean three;
    @Transient
    private boolean four;
    @Transient
    private LocalDate regDate;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "user", cascade = CascadeType.REMOVE)
    private List<Bed> bed;

最佳答案

加载1500个用户不应该花费那么长的时间,而是加载关联花费了很长时间。

问题

在JPA中,默认情况下,任何toMany关系都是延迟加载的,这意味着与您的实体一起,您还具有该集合的代理,并且该集合实际上是在第一次访问时加载的,因此在这种情况下,获取1500个用户的时间不会花那么长时间。

在您的情况下,您可以通过指定要在jpa级别上执行的获取操作或在休眠级别上使用@LazyCollection(LazyCollectionOption.FALSE)来禁用延迟加载,因此不建议这样做,并且这样做可能会导致性能问题。



显然,解决方案是不禁用延迟加载

07-24 09:38
查看更多