Maison > base de données > tutoriel mysql > Comment puis-je optimiser NHibernate QueryOver pour éviter plusieurs accès à la base de données lors de la récupération des collections associées ?

Comment puis-je optimiser NHibernate QueryOver pour éviter plusieurs accès à la base de données lors de la récupération des collections associées ?

Mary-Kate Olsen
Libérer: 2025-01-04 13:19:40
original
236 Les gens l'ont consulté

How Can I Optimize NHibernate QueryOver to Avoid Multiple Database Hits When Fetching Related Collections?

Surmonter plusieurs requêtes SQL dans NHibernate QueryOver avec Fetch

Problème :

Utilisation de la syntaxe QueryOver de NHibernate pour récupérer une entité avec une collection associée entraîne de nombreux accès à la base de données. Ce comportement se produit principalement avec des relations plusieurs-à-plusieurs.

Cause :

Le mécanisme de récupération hâtive de NHibernate déclenche des requêtes distinctes pour chaque valeur distincte trouvée dans la colonne de clé étrangère de la relation. . Ce problème se produit lorsque la collection est marquée pour une récupération rapide mais que l'ISession ne contient pas tous les objets nécessaires.

Exemple de mappage :

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id);
        Map(x => x.RoleName);
        HasManyToMany(x => x.UsersInRole)
            .Inverse()
            .LazyLoad()
            .Table("UsersInRoles");
    }
}
Copier après la connexion

Scénario :

Supposons que vous ayez les éléments suivants data :

  • User1 a Role1
  • User2 a à la fois Role1 et Role2

Lors de la récupération de UserRole avec Fetch(x => x.UsersInRole) impatient , la première requête récupérera User1 et Role1. Cependant, comme la session ne contient pas tous les utilisateurs associés au rôle 1, NHibernate exécutera plusieurs requêtes supplémentaires pour récupérer les utilisateurs manquants, ce qui entraînera une dégradation des performances.

Solution :

La solution recommandée consiste à utiliser le mécanisme de récupération par lots de NHibernate en définissant la taille du lot pour le collection :

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

La définition d'une taille de lot de 25 ou plus entraînera NHibernate à récupérer jusqu'à 25 enregistrements à la fois pour la collection chargée paresseusement. Cette optimisation combinera la récupération de la collection dans la requête initiale ou un nombre minimum de requêtes supplémentaires, réduisant ainsi considérablement les accès à 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!

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