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"); } }
Szenario :
Gehen Sie davon aus, dass Sie Folgendes haben Daten:
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)
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!