Heim > Datenbank > MySQL-Tutorial > Wie kann ich NHibernate QueryOver optimieren, um beim Abrufen verwandter Sammlungen mehrere Datenbanktreffer zu vermeiden?

Wie kann ich NHibernate QueryOver optimieren, um beim Abrufen verwandter Sammlungen mehrere Datenbanktreffer zu vermeiden?

Mary-Kate Olsen
Freigeben: 2025-01-04 13:19:40
Original
231 Leute haben es durchsucht

How Can I Optimize NHibernate QueryOver to Avoid Multiple Database Hits When Fetching Related Collections?

Überwindung mehrerer SQL-Abfragen in NHibernate QueryOver mit Fetch

Problem:

Verwendung der QueryOver-Syntax von NHibernate zum Abrufen einer Entität mit einer zugehörigen Sammlung führt zu zahlreichen Datenbanktreffern. Dieses Verhalten tritt meist bei Viele-zu-Viele-Beziehungen auf.

Ursache:

Der Eager-Fetching-Mechanismus von NHibernate löst separate Abfragen für jeden eindeutigen Wert aus, der in der Fremdschlüsselspalte der Beziehung gefunden wird . Dieses Problem tritt auf, wenn die Sammlung für Eager Fetching markiert ist, die ISession jedoch nicht alle erforderlichen Objekte enthält.

Beispielzuordnung:

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id);
        Map(x => x.RoleName);
        HasManyToMany(x => x.UsersInRole)
            .Inverse()
            .LazyLoad()
            .Table("UsersInRoles");
    }
}
Nach dem Login kopieren

Szenario :

Gehen Sie davon aus, dass Sie Folgendes haben Daten:

  • Benutzer1 hat Rolle1
  • Benutzer2 hat sowohl Rolle1 als auch Rolle2

Beim Abrufen von UserRole mit Fetch(x => x.UsersInRole) eifrig , ruft die erste Abfrage Benutzer1 und Rolle1 ab. Da die Sitzung jedoch nicht alle mit Rolle1 verknüpften Benutzer enthält, führt NHibernate mehrere zusätzliche Abfragen aus, um die fehlenden Benutzer abzurufen, was zu Leistungseinbußen führt.

Lösung:

Die empfohlene Lösung besteht darin, den Stapelabrufmechanismus von NHibernate zu verwenden, indem die Stapelgröße für festgelegt wird Sammlung:

HasManyToMany(x => x.UsersInRole)
    ...
    .BatchSize(25)
Nach dem Login kopieren

Das Festlegen einer Stapelgröße von 25 oder höher führt dazu, dass NHibernate bis zu 25 Datensätze gleichzeitig für die verzögert geladene Sammlung abruft. Durch diese Optimierung wird das Abrufen der Sammlung innerhalb der ersten Abfrage oder einer minimalen Anzahl zusätzlicher Abfragen kombiniert, wodurch Datenbanktreffer erheblich reduziert werden.

Das obige ist der detaillierte Inhalt vonWie kann ich NHibernate QueryOver optimieren, um beim Abrufen verwandter Sammlungen mehrere Datenbanktreffer zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage