繁体   English   中英

我的实体加载速度超慢有什么问题?

[英]What is wrong with my entity that it is loading super slow?

我有以下实体:

@Entity
@Table(name="\"Order\"")
public class Order {
    @Id
    @SequenceGenerator(name="order_id_seq",
            sequenceName="order_id_seq",
            allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator="order_id_seq")
    private long id;
    @OneToOne
    private Customer customerDetails;
    @OneToOne
    private ProductDetails productDetails;
    @OneToOne
    private TransportDetails transportDetails;
    @OneToOne
    private OtherDetails otherDetails;
    @OneToOne
    private OtherDetails otherDetails2;
    @OneToOne
    private OtherDetails3 otherDetails3;

    private LocalDateTime dateOrderPlaced;

    private LocalDateTime dateOrderPaid;

    private Float totalPrice;

    @Size(max = 1000)
    private String orderComment;
}

现在,每当我第一次运行此查询时,都会使用以下存储库:

public interface OrderRepository extends CrudRepository<Order, Long> {

    @Transactional
    @Modifying
    @Query("UPDATE Order o SET o.totalPrice = (:price) WHERE o.id= (:id)")
    void updateTotalPrice(@Param("id") Long id, @Param("price") Float price);

    @Override
    List<Order> findAll();

    @Override
    Order save(@Valid Order order);
}

执行以下操作大约需要 5 秒钟:

public List<OrderDto> getOrders(){
    return orderDtoMapper.fromDomain(orderRepository.findAll());
}

在哪里:

public List<OrderDto> fromDomain(List<Order> orders){
    return orders
            .stream()
            .map(order -> fromDomain(order))
            .collect(Collectors.toList());
}

public OrderDto fromDomain(Order order){
    OrderDto orderDto = new OrderDto();
    orderDto.setTransportDetails(transportDetailsDtoMapper.fromDomain(order.getTransportDetails()));
    orderDto.setTotalPrice(order.getTotalPrice());
    orderDto.setDateOrderPaid(order.getDateOrderPaid());
    orderDto.setDateOrderPlaced(order.getDateOrderPlaced());
    orderDto.setId(order.getId());

    return orderDto;
}

笔记

我的表中只有 3 个实体...

尝试在@OneToOne注释中添加"mappedBy"值。 实际上,看起来你有什么问题:

    @OneToOne
    private OtherDetails otherDetails;
    @OneToOne
    private OtherDetails otherDetails2;
    @OneToOne
    private OtherDetails3 otherDetails3;

不知道为什么有两个类OtherDetails和一个类OtherDetails3,但看起来你应该这样做

@OneToMany(...)
List<OtherDetails> otherDetails

而且,可能是,你有太多的数据。 启用您的休眠日志,并直接在您的 sql(据我所知的 oracle)服务器中执行查询。 可能是 sql server 没有足够的内存来存储结果集,它执行写入磁盘操作。

我的问题是我在多个字段上使用@Convert注释,这减慢了整个过程。 例如:

@Data
@Entity
@Table(name="\"Customer\"")
public class Customer {
    @Id
    @SequenceGenerator(name="customer_id_seq",
            sequenceName="customer_id_seq",
            allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator="customer_id_seq")
    private long id;
    private String firstName;
    @Convert(converter = LastNameEncryption.class)
    private String lastName;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM