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