Maison > base de données > tutoriel mysql > Pourquoi NHibernate QueryOver avec Eager Fetching provoque-t-il plusieurs requêtes de base de données ?

Pourquoi NHibernate QueryOver avec Eager Fetching provoque-t-il plusieurs requêtes de base de données ?

Mary-Kate Olsen
Libérer: 2025-01-05 02:40:41
original
323 Les gens l'ont consulté

Why Does NHibernate QueryOver with Eager Fetching Cause Multiple Database Queries?

NHibernate QueryOver avec Fetch : explication de plusieurs requêtes SQL et accès à la base de données

Lors de la tentative de récupération d'une entité et de récupération d'une liste associée à l'aide de QueryOver de NHibernate syntaxe, les développeurs peuvent rencontrer de nombreuses requêtes SQL et accès à la base de données redondants. Ce problème survient lorsque la récupération rapide est utilisée.

Considérez le code suivant :

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
Copier après la connexion

Cette requête entraînera une série d'accès à la base de données, notamment :

  • Une requête initiale pour récupérer les entités UserRole.
  • Plusieurs requêtes ultérieures pour récupérer les entités UsersInRole pour chacune UserRole.

Ce comportement découle de la stratégie de récupération avide de NHibernate. Lorsque la récupération rapide est activée, la collection associée est chargée immédiatement avec l'entité parent. Cependant, chaque objet associé peut avoir des associations différentes qui doivent être récupérées, ce qui entraîne des requêtes supplémentaires.

Dans l'exemple de mappage fourni, les entités UserRole et UsersInRole ont une relation plusieurs-à-plusieurs. Lors de la récupération impatiente des UserRoles avec cette relation, la session ne contiendra que des informations sur le UserRole récupéré, et non sur ses UsersInRole associés.

Pour atténuer ce problème, la récupération par lots doit être utilisée. En définissant la propriété BatchSize sur le mappage de collection, NHibernate récupérera les entités associées par lots plutôt que d'exécuter des requêtes individuelles pour chaque objet associé.

Solution :

HasManyToMany(x => x.UsersInRole)
...
.BatchSize(25)
Copier après la connexion

L'attribution d'une taille de lot aux deux cartes de collection (y compris la carte de classe) garantit que plusieurs requêtes sont exécutées au lieu de nombreuses requêtes redondantes. Le nombre exact de requêtes dépendra des paramètres de taille du lot et de taille de page.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal