NHibernate QueryOver avec Fetch entraînant plusieurs exécutions de requêtes
L'exécution d'un QueryOver avec une clause Fetch pour récupérer une entité parent et sa collection enfant entraîne souvent dans des accès excessifs à la base de données. Ce comportement se produit car NHibernate émet une requête distincte pour chaque ligne de la collection enfant.
Pour comprendre cela, considérons un scénario avec une entité UserRole et une collection UsersInRole. La première requête récupère les entités UserRole :
SELECT ... FROM UserRoles left outer join UsersInRoles on ...
Pour chaque UserRole récupéré, NHibernate exécute ensuite une requête distincte pour récupérer la collection UsersInRole, ce qui donne lieu à de nombreuses requêtes au format :
SELECT ... FROM UsersInRoles left outer join UserRoles on ... WHERE UserRoles.UserId=?
Pour optimiser ce comportement, NHibernate permet de définir une propriété BatchSize sur HasManyToMany mapping :
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
En spécifiant cette option, NHibernate chargera la collection enfant par lots, réduisant le nombre de requêtes de base de données à un maximum de 1 (taille du lot / taille de la page). Cela garantit une récupération efficace des données associées tout en évitant des accès excessifs à 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!