Maison > base de données > tutoriel mysql > Pourquoi le chargement rapide de NHibernate QueryOver provoque-t-il plusieurs requêtes de base de données ?

Pourquoi le chargement rapide de NHibernate QueryOver provoque-t-il plusieurs requêtes de base de données ?

Patricia Arquette
Libérer: 2025-01-04 21:54:38
original
520 Les gens l'ont consulté

Why Does NHibernate QueryOver's Eager Loading Cause Multiple Database Queries?

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();
Copier après la connexion

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 :

  • Une requête initiale pour récupérer tous les UserRoles.
  • Des requêtes supplémentaires pour chaque UserRole pour récupérer les UsersInRole associés.

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);
    }
}
Copier après la connexion

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

  • L'utilisation de fetch="fetch" dans HQL peut également entraîner plusieurs requêtes de base de données. Pour éviter cela, utilisez plutôt fetch="select".
  • Une récupération hâtive peut augmenter considérablement l'utilisation de la mémoire. Utilisez-le judicieusement et seulement lorsque cela est nécessaire.

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