将列表用作列会导致性能下降-JPA

问题描述 投票:0回答:1

我正在使用休眠方式,并且我已经注意到,当使用列表作为列时,使用JpaRepository从数据库(findById)中获取数据会花费很多时间。在日志中,我发现查询是正确的:

select
    measuremen0_.data_id as dat1_3_0_,
    measuremen0_.measurements as measurem2_3_0_,
    measuremen0_.measurements_order as measurem3_0_ 
from
    data_measurements measuremen0_ 
where
    measuremen0_.data_id=?

但是在查询之后,初始化需要很多时间,甚至比查询本身还要花费很多时间:

Preparing collection initializer:
Found row of collection:
Found row of collection:
Found row of collection:
... (times number of measurements)

集合准备的目的是什么?可以跳过吗?这是我的实体类:

@Entity
public class Data {

@Id
private long id;

@ElementCollection(fetch = FetchType.EAGER)
@OrderColumn
@Column(columnDefinition = "TEXT", updatable = false)
private List<String> measurements;
java hibernate jpa spring-data-jpa hibernate-mapping
1个回答
1
投票

过度加载任何集合都可能导致性能下降。请注意,大多数持久性提供程序至少需要对数据库进行N + 1个SELECT才能填充您的数据-第一个要检索所有所有者实体的SELECT,而对于需要填充到每个实体中的每个列表,则需要一个SELECT。如果可能的话,请删除急切的获取,然后在选择给定数据后获取列表。

将TEXT用作columnDefinition可能也会产生很大的影响,因为某些数据库不是将数据保留在normal column中,而是将每个寄存器移动到自己的寄存器或文件中。如果可以的话,将您的列定义换成一个长度定义,这将使数据库能够更好地以物理方式持久保存您的数据并随后修剪查询。

© www.soinside.com 2019 - 2024. All rights reserved.