Heim >Datenbank >MySQL-Tutorial >Warum verursacht NHibernate QueryOver mit Eager Fetching mehrere Datenbankabfragen?

Warum verursacht NHibernate QueryOver mit Eager Fetching mehrere Datenbankabfragen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-05 02:40:41404Durchsuche

Why Does NHibernate QueryOver with Eager Fetching Cause Multiple Database Queries?

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:

  • Eine erste Abfrage zum Abrufen der UserRole-Entitäten.
  • Mehrere nachfolgende Abfragen zum Abrufen der UsersInRole-Entitäten für jede UserRole.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn