Heim >Datenbank >MySQL-Tutorial >Warum verursacht NHibernate QueryOver mit Eager Fetching mehrere Datenbankabfragen?
NHibernate QueryOver mit Fetch: Erklärung mehrerer SQL-Abfragen und Datenbanktreffer
Beim Versuch, eine Entität abzurufen und eine Themenliste mithilfe von QueryOver von NHibernate abzurufen Aufgrund der Syntax können Entwickler auf zahlreiche redundante SQL-Abfragen und Datenbanktreffer stoßen. Dieses Problem tritt auf, wenn Eager Fetching verwendet wird.
Beachten Sie den folgenden Code:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
Diese Abfrage führt zu einer Reihe von Datenbanktreffern, darunter:
Dieses Verhalten ist auf die Eager-Fetching-Strategie von NHibernate zurückzuführen. Wenn Eager Fetching aktiviert ist, wird die zugehörige Sammlung sofort zusammen mit der übergeordneten Entität geladen. Allerdings kann jedes verwandte Objekt unterschiedliche Zuordnungen haben, die abgerufen werden müssen, was zu zusätzlichen Abfragen führt.
Im bereitgestellten Zuordnungsbeispiel haben die Entitäten UserRole und UsersInRole eine Viele-zu-Viele-Beziehung. Beim Eifrig-Abrufen von UserRoles mit dieser Beziehung enthält die Sitzung nur Informationen über die abgerufene UserRole, nicht die zugehörigen UsersInRole.
Um dieses Problem zu mildern, sollte Batch-Abrufen eingesetzt werden. Durch Festlegen der BatchSize-Eigenschaft für die Sammlungszuordnung ruft NHibernate zusammengehörige Entitäten in Stapeln ab, anstatt für jedes zugehörige Objekt einzelne Abfragen auszuführen.
Lösung:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
Durch die Zuweisung einer Batchgröße zu beiden Sammlungszuordnungen (einschließlich der Klassenzuordnung) wird sichergestellt, dass mehrere Abfragen statt zahlreicher redundanter Abfragen ausgeführt werden. Die genaue Anzahl der Abfragen hängt von der Stapelgröße und den Einstellungen für die Seitengröße ab.
Das obige ist der detaillierte Inhalt vonWarum verursacht NHibernate QueryOver mit Eager Fetching mehrere Datenbankabfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!