Problème de requête :
Lors de l'utilisation QueryOver pour récupérer une liste associée à l'aide d'un chargement rapide, plusieurs accès à la base de données se produisent, ce qui entraîne de nombreux SQL distincts requêtes.
Exemple :
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
Explication :
Ce comportement est dû à la nature de plusieurs-à -de nombreuses relations. Dans l'exemple de mappage, une entité UserRole a une relation plusieurs-à-plusieurs avec les entités UsersInRole. Lorsque le chargement rapide est utilisé, NHibernate tente de charger toutes les entités UsersInRole associées pour chaque entité UserRole récupérée.
Cependant, étant donné que la session ne contient peut-être pas encore toutes les entités associées, plusieurs requêtes SQL sont émises pour récupérer ces relations. La requête initiale récupère les entités UserRole et des requêtes ultérieures sont émises pour chaque UserRole afin de récupérer ses entités UsersInRole associées.
Solution :
Une solution efficace pour minimiser les requêtes SQL consiste à utiliser la récupération par lots. En définissant la propriété BatchSize sur le mappage HasManyToMany, NHibernate peut récupérer plusieurs entités associées dans une seule requête SQL.
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
En définissant la taille du lot sur une valeur appropriée (par exemple, 25), NHibernate émettra un nombre limité de requêtes SQL, réduisant ainsi le nombre total d'accès à la base de données et améliorant les performances.
De plus, la définition de la taille du lot sur la carte de classe peut aider également à optimiser la stratégie globale de récupération.
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!