【问题标题】:CrudRepository findAll() takes way to long - alternative? increase performance?CrudRepository findAll() 采取长期替代方案?提高性能?
【发布时间】:2018-01-08 00:03:37
【问题描述】:

在我的控制器中,我使用 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;

【问题讨论】:

  • 您需要在急切模式下加载列表bed 还是在惰性模式下加载?这可能会产生影响。

标签: java spring spring-boot spring-data


【解决方案1】:

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

问题

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

在您的情况下,您通过在 jpa 级别指定 fetch 或在休眠级别使用 @LazyCollection(LazyCollectionOption.FALSE) 来禁用延迟加载,不建议这样做并且预计会出现性能问题。

解决方案

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多