2016-10-11 5 views
2

나는 다음과 같은 기업이 : 이제내 엔티티에서로드가 매우 느립니 뭐가 잘못 되었나요?

@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; 
} 

을, 나는 다음과 같은 저장소 사용, 처음으로이 쿼리를 실행하고 때마다 : 그것은 다음을 실행하기 위해 약 5 초 정도 걸립니다

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); 
} 

를 :

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 개체가 ...

+1

fromDomain()은 빠릅니다. 나는'orderRepository.findAll()'이 연결을 획득하는 데 시간이 걸린다 고 생각한다. –

+0

@BorisShchegolev, 저는 실제로 단지 너무 오래 걸리는 것을 발견했습니다. 몇 가지 필드를 암호화하기 위해 몇 가지 @Convert() 주석을 사용했습니다. 전체 프로세스의 속도가 느려지는 곳입니다. – uksz

+0

관심있는 사용자는 여기 있습니다. 후속 질문 : http://stackoverflow.com/questions/39972028/adding-convert-on-column-increases-execution-time – uksz

답변

1

봅니다 @OneToOne 주석에 "mappedBy" 값을 추가 할 수 있습니다. 월 두 클래스의 OtherDetails와 하나 개의 클래스 OtherDetails3이 왜

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

이 몰라,하지만 당신은 또한

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

을해야하고 같이 : Actualy, 당신이 뭔가 잘못이 같이 데이터가 너무 많습니다. 최대 절전 모드 로그를 활성화하고 SQL (직접 이해할 수있는 오라클) 서버에서 쿼리를 직접 실행하십시오. SQL Server가 결과 집합을위한 메모리가 부족하여 디스크 작업에 쓰기를 수행합니다.

+0

OtherDetails는 내가 가지고있는 클래스의 예제 이름입니다. – uksz

+0

나는 오랜 시간이 걸리는 것을 발견했다. 일부 필드를 암호화하기 위해 @Convert() 주석을 몇 개 가지고 있는데, 전체 프로세스의 속도를 늦춘다. – uksz

0

내 문제는 내가 여러 개의 필드에 @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; 
} 
관련 문제