- Ja,
@BatchSize
är tänkt att användas med lata associationer. - Hibernate kommer att köra flera satser i de flesta situationer ändå, även om antalet oinitierade proxyservrar/samlingar är mindre än den angivna batchstorleken. Se det här svaret för mer information. Dessutom kan fler lättare frågor jämfört med mindre större på ett positivt sätt bidra till systemets totala genomströmning.
@BatchSize
på klassnivå betyder att den angivna batchstorleken för entiteten kommer att tillämpas för alla@*ToOne
lata associationer med den enheten. Se exemplet medPerson
enhet i dokumentationen.
De länkade frågorna/svaren du angav är mer oroade över behovet av optimering och lat laddning i allmänhet. De gäller förstås här också, men de är inte bara relaterade till batchladdning, vilket bara är ett av de möjliga tillvägagångssätten.
En annan viktig sak handlar om ivrig laddning som nämns i de länkade svaren och som antyder att om en fastighet alltid används så kan du få bättre prestanda genom att använda ivrig laddning. Detta är i allmänhet inte sant för samlingar och i många situationer för to-one föreningar heller.
Anta till exempel att du har följande entitet för vilken bs
och cs
är alltid används när A
används.
public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
Laddar ivrigt bs
och cs
uppenbarligen lider av N+1 väljer problem om du inte går med dem i en enda fråga. Men om du sammanfogar dem i en enda fråga, till exempel som:
select a from A
left join fetch a.bs
left join fetch a.cs
sedan skapar du fullständig kartesisk produkt mellan bs
och cs
och returnerar count(a.bs) x count(a.cs)
rader i resultatuppsättningen för varje a
som läses en efter en och sätts ihop till enheterna A
och deras samlingar av bs
och cs
.
Batchhämtning skulle vara mycket optimal i denna situation, eftersom du först skulle läsa A
s, sedan bs
och sedan cs
, vilket resulterar i fler frågor men med mycket mindre total mängd data som överförs från databasen. Dessutom är de separata frågorna mycket enklare än en stor med kopplingar och är lättare för databasen att köra och optimera.