hibernate
Prestandajustering
Sök…
Använd inte EAGER-hämtningstyp
Hibernate kan använda två typer av hämtning när du kartlägger förhållandet mellan två enheter: EAGER
och LAZY
.
I allmänhet är EAGER
hämtningstypen inte bra, eftersom den säger till JPA att alltid hämta uppgifterna, även om dessa uppgifter inte är nödvändiga.
Exempelvis om du har en Person
enhet och förhållandet till Address
som detta:
@Entity
public class Person {
@OneToMany(mappedBy="address", fetch=FetchType.EAGER)
private List<Address> addresses;
}
Varje gång du frågar en Person
kommer listan med Address
för denna Person
att returneras.
Så istället för att kartlägga din enhet med:
@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)
Använda sig av:
@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)
En annan sak att uppmärksamma är relationerna @OneToOne
och @ManyToOne
. Båda är som standard EAGER. Så om du är orolig för hur din ansökan fungerar måste du ställa in hämtningen för den här typen av relation:
@ManyToOne(fetch=FetchType.LAZY)
Och:
@OneToOne(fetch=FetchType.LAZY)
Använd sammansättning istället för arv
Viloläge har några arvsstrategier. Den JOINED
gör en JOIN mellan barnenheten och moderföretaget.
Problemet med detta tillvägagångssätt är att Viloläge alltid tar med sig data från alla involverade tabeller i arvet.
Exempelvis om du har enheterna Bicycle
och MountainBike
använder den JOINED
:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {
}
Och:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {
}
Alla JPQL-frågor som träffar MountainBike
kommer med Bicycle
och skapar en SQL-fråga som:
select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...
Om du har en annan förälder för Bicycle
(som exempelvis Transport
, per exempel), kommer den här frågan att föra informationen från den här föräldern också, vilket gör en extra JOIN.
Som ni ser är detta också en typ av EAGER
kartläggning. Du har inte valet att bara ta med data från MountainBike
tabellen med denna arvstrategi.
Det bästa för prestanda är användningskomposition istället för arv.
För att uppnå detta kan du kartlägga MountainBike
enheten för att ha en bicycle
:
@Entity
public class MountainBike {
@OneToOne(fetchType = FetchType.LAZY)
private Bicycle bicycle;
}
Och Bicycle
:
@Entity
public class Bicycle {
}
Varje fråga nu kommer bara med MountainBike
data som standard.