Un chargement rapide dans NHibernate QueryOver entraîne plusieurs requêtes de base de données
Lors de l'exécution d'une récupération rapide d'une liste associée à l'aide de NHibernate QueryOver, cela peut entraîner dans plusieurs requêtes de base de données. Cela peut entraîner une augmentation significative du trafic de la base de données et une réduction des performances.
Considérez le scénario suivant :
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
Cette requête tente de sélectionner une collection de UserRoles et de récupérer avec impatience les UsersInRole associés. Cependant, cela entraîne plusieurs requêtes de base de données distinctes :
Cause de plusieurs requêtes
NHibernate utilise le batch récupération pour récupérer efficacement les entités associées. Toutefois, lorsque le nombre d'entités associées dépasse la taille du lot, des requêtes supplémentaires sont requises. Dans le scénario ci-dessus, la taille du lot est probablement trop petite pour récupérer tous les UsersInRole en une seule requête.
Solution : Ajuster la taille du lot
Pour résoudre ce problème, vous peut ajuster la taille du lot utilisée pour une récupération rapide. En définissant une taille de lot plus grande, NHibernate tentera de récupérer davantage d'entités associées dans une seule requête. Cela peut réduire considérablement le nombre d'accès à la base de données.
Modifiez le mappage comme suit :
public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { ... HasManyToMany(x => x.UsersInRole) ... .BatchSize(25); } }
La définition de la taille du lot sur 25 demandera à NHibernate de récupérer un maximum de 25 entités UsersInRole par requête. . Cela peut entraîner moins de requêtes et une amélioration des performances.
Considérations supplémentaires
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!