- Ja,
@BatchSize
soll mit faulen Assoziationen verwendet werden. - Hibernate führt in den meisten Situationen ohnehin mehrere Anweisungen aus, selbst wenn die Anzahl nicht initialisierter Proxys/Sammlungen kleiner als die angegebene Stapelgröße ist. Weitere Informationen finden Sie in dieser Antwort. Außerdem können leichtere Abfragen im Vergleich zu weniger großen Abfragen positiv zum Gesamtdurchsatz des Systems beitragen.
@BatchSize
auf Klassenebene bedeutet, dass die angegebene Stapelgröße für die Entität für alle@*ToOne
angewendet wird faule Assoziationen mit dieser Entität. Siehe Beispiel mitPerson
Entität in der Dokumentation.
Die verknüpften Fragen/Antworten, die Sie bereitgestellt haben, befassen sich eher mit der Notwendigkeit der Optimierung und dem verzögerten Laden im Allgemeinen. Sie gelten natürlich auch hier, aber sie beziehen sich nicht nur auf das Laden von Stapeln, was nur einer der möglichen Ansätze ist.
Eine weitere wichtige Sache betrifft das eifrige Laden, das in den verknüpften Antworten erwähnt wird und darauf hindeutet, dass Sie durch das eifrige Laden möglicherweise eine bessere Leistung erzielen, wenn eine Eigenschaft immer verwendet wird. Dies ist im Allgemeinen nicht wahr für Sammlungen und in vielen Situationen auch für Eins-zu-Eins-Assoziationen.
Angenommen, Sie haben die folgende Entität, für die bs
und cs
sind immer verwendet, wenn A
verwendet wird.
public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
bs
wird eifrig geladen und cs
leidet offensichtlich unter N + 1-Auswahlproblemen, wenn Sie sie nicht in einer einzigen Abfrage verbinden. Aber wenn Sie sie in einer einzigen Abfrage verbinden, zum Beispiel wie:
select a from A
left join fetch a.bs
left join fetch a.cs
dann erstellen Sie ein vollständiges kartesisches Produkt zwischen bs
und cs
und Rückgabe von count(a.bs) x count(a.cs)
Zeilen in der Ergebnismenge für jeden a
die einzeln gelesen und zu den Entitäten von A
zusammengesetzt werden und ihre Sammlungen von bs
und cs
.
Batch-Fetching wäre in dieser Situation sehr optimal, da Sie zuerst A
lesen würden s, dann bs
und dann cs
, was zu mehr Abfragen führt, aber mit einer viel geringeren Gesamtdatenmenge, die von der Datenbank übertragen wird. Außerdem sind die separaten Abfragen viel einfacher als eine große Abfrage mit Verknüpfungen und für die Datenbank einfacher auszuführen und zu optimieren.