Hazırda bekletme konusunda çok yeniyim. Burada iki seçeneği karşılaştırmak istiyorum. aşağıdaki gibiHazırda Bekleme Performansı sorunu
İlk seçenek
Benim hazırda pojo sınıfları.
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
}
Her stok özelliklerin bir listesini içerir. Stoku ne zaman alırsam, karakteristik girişlerin listesi ilişkilendirilir ve sonuç elde edilir.
Stok tablomda 1 milyondan fazla kayıt bulunur ve her stok 10 karakteristiktir (bu nedenle stock_characteristics 10 milyondan fazla satır içerir). Tüm sonucu aldığımızda, hisse senedi ve Karakteristik arasındaki ilişki yavaşlayabilir.
İkinci seçenek.
Pojo sınıflarım aşağıdaki gibi yeniden yazarım.
Stock {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "stock_id")
private Long stockId;
@Column(name = "stock_name")
private String stockName;
//constructor, getters and setters
}
Özellikleri - yukarıdaki ile aynıdır ve
benim sonuç kümesini almak içinStockCharacteristics {
@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;
}
, ben özelliklerinin sadece bir set geçirerek. Örneğin, karakteristiği 2 olarak geçerse, önce her iki özelliğe sahip olan stok kimliklerini buluyorum. Daha sonra hisse senedi detaylarını Stock sınıfından yansıtacağım. İşte ilk seçenek için örnek kodum. İşte
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();
}
Bir katılmak sorgu aşağı yavaş ve
buradabir programdır noktası olarak ikinci seçenek
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();
}
benim örnek kod olabilen Stock ve Karakteristik arasında gerçekleştirilir görebilirsiniz seçmek için en iyi seçenek hangisi? veya daha iyi performans için hangisini kullanmalıyım?