Problème :
Utilisation de la syntaxe QueryOver de NHibernate pour récupérer une entité avec une collection associée entraîne de nombreux accès à la base de données. Ce comportement se produit principalement avec des relations plusieurs-à-plusieurs.
Cause :
Le mécanisme de récupération hâtive de NHibernate déclenche des requêtes distinctes pour chaque valeur distincte trouvée dans la colonne de clé étrangère de la relation. . Ce problème se produit lorsque la collection est marquée pour une récupération rapide mais que l'ISession ne contient pas tous les objets nécessaires.
Exemple de mappage :
public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { Id(x => x.Id); Map(x => x.RoleName); HasManyToMany(x => x.UsersInRole) .Inverse() .LazyLoad() .Table("UsersInRoles"); } }
Scénario :
Supposons que vous ayez les éléments suivants data :
Lors de la récupération de UserRole avec Fetch(x => x.UsersInRole) impatient , la première requête récupérera User1 et Role1. Cependant, comme la session ne contient pas tous les utilisateurs associés au rôle 1, NHibernate exécutera plusieurs requêtes supplémentaires pour récupérer les utilisateurs manquants, ce qui entraînera une dégradation des performances.
Solution :
La solution recommandée consiste à utiliser le mécanisme de récupération par lots de NHibernate en définissant la taille du lot pour le collection :
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
La définition d'une taille de lot de 25 ou plus entraînera NHibernate à récupérer jusqu'à 25 enregistrements à la fois pour la collection chargée paresseusement. Cette optimisation combinera la récupération de la collection dans la requête initiale ou un nombre minimum de requêtes supplémentaires, réduisant ainsi considérablement les accès à la base de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!