2016-08-01 2 views
6

나는 Hibernate를 처음 사용했다. 여기 두 가지 옵션을 비교하고 싶습니다. 다음과 같이최대 절전 모드 성능 문제

첫 번째 옵션을

내 최대 절전 모드 POJO 클래스.

Stock { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "stock_id") 
    private Long stockId; 

    @Column(name = "stock_name") 
    private String stockName; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "stock_characteristics", joinColumns = {@JoinColumn(name = "stock_id")}, inverseJoinColumns = {@JoinColumn(name = "ct_id")}) 
    private List<Characteristic> characteristics = new ArrayList<>(); 

    //constructor, getters and setters 

} 

Characteristics { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ct_id", nullable = false) 
    private Long id; 

    @Column(name = "name", nullable = false, length = 32) 
    private String name; 

    //constructor, getters and setters 
} 

각 재고에는 특성 목록이 들어 있습니다. 주식을 가져올 때마다 특성 항목 목록이 연결되어 결과가 나타납니다.

내 주식 테이블에는 1 백만 개가 넘는 레코드가 포함되어 있으며 각 주식은 10 개의 특성과 연관되어 있습니다 (따라서 stock_characteristics는 1,000 만 개가 넘는 행을 포함합니다). 전체 결과를 가져 오면 주식과 특성 간의 연관성이 느려질 수 있습니다.

두 번째 옵션.

다음과 같이 pojo 클래스를 다시 작성합니다.

Stock { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "stock_id") 
    private Long stockId; 

    @Column(name = "stock_name") 
    private String stockName; 

    //constructor, getters and setters 

} 

특성 - 상기와 같은 및

내 결과 집합을 얻기 위해
StockCharacteristics { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(name = "id") 
     private Long id; 
     @Column(name = "stock_id", nullable = false) 
     private Long stockId; 
     @Column(name = "ct_id", nullable = false) 
     private Long ctId; 
    } 

, 나는 특성의 집합을 통과하고있다. 예를 들어 특성을 2로 전달하면 먼저 두 특성을 모두 갖는 주식 id를 찾습니다. 그럼 Stock 클래스의 주식 정보를 투영합니다. 다음은 첫 번째 옵션에 대한 샘플 코드입니다. 여기

criteria.createAlias("stock.characteristics", "stockCharacteristics",  CriteriaSpecification.INNER_JOIN).add(Restrictions.in("stockCharacteristics.id", listOfSelectedCharacteristics)); 
    List<Object[]> projectedList = criteria.setProjection(Projections.projectionList().add(Projections.count("id")).add(Projections.groupProperty("id"))).list(); 
    List<Long> stockIdList = new ArrayList<>(); 
    for(Object[] entry: projectedList){ 
     if(((Long) entry[0]).intValue() == listOfSelectedCharacteristics.size()){ 
      stockIdList.add((Long)entry[1]); 
     } 
    } 

    if(!stockIdList.isEmpty()){ 
     Criteria criteriaWithCharacteristics = getDb(true).createCriteria(Stock.class, "stock").add(Restrictions.in("id", stockIdList)); 
     selectedStocks = criteriaWithCharacteristics.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list(); 
    } 

당신은 조인 쿼리 다운을 느리게하고

여기

이의 프로그램 지점으로 두 번째 옵션

List<Object[]> stockIdList = //gets the stock id list from StockCharacteristics 
    if(!stockIdList.isEmpty()){ 
     Criteria criteriaWithCharacteristics = getDb(true).createCriteria(Stock.class, "stock").add(Restrictions.in("id", stockIdList)); 
     selectedStocks = criteriaWithCharacteristics.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list(); 
    } 

내 샘플 코드입니다 수있는 주식 및 특성 사이에 수행 볼 수 있습니다 선택할 수있는 최상의 옵션은 무엇입니까? 또는 더 나은 성능을 위해 사용해야하는 것은 어느 것입니까?

답변

0

엔티티 간의 모든 관계를 최대 절전 모드로 매핑해야한다고 생각합니다. hql과 criteria를 사용하고자한다면 엔티티 들간의 join을 할 수 없을 것입니다.

는 성능을 위해, LAZY로 모든 매핑을 표시하고이 읽기 :

https://zeroturnaround.com/rebellabs/how-to-use-jpa-correctly-to-avoid-complaints-of-a-slow-application/

내가 자주 사용하는 MS SQL 서버를 내 쿼리가 잘 색인되도록 내 느린 쿼리의 실행 계획을 확인 . mysql을 사용하면 "show index"를 사용할 수 있습니다