2016-08-01 18 views
6

Jestem bardzo nowy w Hibernate. Tutaj chciałbym porównać dwie opcje.Problem z wydajnością Hibernacji

pierwsza opcja

Moi hibernacji klasy POJO następująco.

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 
} 

Każde zdjęcie zawiera listę cech. Ilekroć pobierasz zapasy, lista charakterystycznych wpisów zostanie skojarzona, a wynik zostanie uzyskany.

Moja tabela zapasów zawiera ponad 1 milion rekordów, a każdy magazyn powiązany jest z 10 charakterystycznymi cechami (więc cecha_produktu zawiera ponad 10 milionów wierszy). Kiedy pobieramy cały wynik, związek między czasem i charakterystyką może się spowolnić.

Druga opcja.

Przepiszę moje zajęcia pojo w następujący sposób.

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

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

    //constructor, getters and setters 

} 

Charakterystyka - tak samo jak wyżej i

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

Uzyskania mój zestaw wyników, ja przechodząc tylko zestaw cech. Na przykład, jeśli przechodzisz charakterystykę jako 2, to najpierw znajduję identyfikatory, które mają obie cechy. Następnie przedstawię szczegóły dotyczące zapasów z klasy Stock. Oto mój przykładowy kod dla pierwszej opcji.

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

Tutaj można zobaczyć zapytania dołączyć odbywa się pomiędzy magazynie i charakterystyczne, które mogą spowolnić w dół i

tutaj jest mój przykładowy kod dla drugiej opcji

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

jako punkt programowej widok, który jest najlepszą opcją do wyboru? lub który z nich powinienem użyć dla lepszej wydajności?

Odpowiedz

0

Myślę, że powinieneś odwzorować w hibernacji wszystkie relacje między obiektami. Pomoże Ci to, jeśli chcesz używać hql i kryteriów, w przeciwnym razie nie będziesz mógł łączyć się między jednostkami.

Za wykonanie zaznaczyć wszystkie swoje odwzorowanie jako leniwe i przeczytać:

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

często używam serwera MS SQL i sprawdź plan wykonania mojego powolnego zapytania, aby zapewnić, że moje zapytanie jest dobrze indeksowane . Z mysql możesz użyć "show index"

Powiązane problemy