Pourquoi ouvrir une session en vue dans Hibernate est une mauvaise pratique
Ouvrir une session en vue (OSIV) est un modèle dans Hibernate qui implique de conserver la session ouverte via une requête HTTP. Bien que cela puisse sembler bénéfique pour éviter les LazyLoadExceptions, cela présente de nombreux inconvénients :
Problèmes de perspective de base de données :
-
Mode de validation automatique : Étant donné que les transactions sont validées par la couche de service mais pas explicitement dans OSIV, les instructions de base de données suivantes issues du rendu de l'interface utilisateur sont exécutées en mode de validation automatique. Cela met à rude épreuve le serveur de base de données en nécessitant des vidages fréquents du journal des transactions.
-
Sources d'instructions mixtes : OSIV permet de générer des instructions à la fois par la couche de service et par le processus de rendu de l'interface utilisateur, ce qui rend les tests difficiles. interactions de base de données entre les couches.
Complexité et évolutivité du code Problèmes :
-
Capacités limitées de l'interface utilisateur : OSIV limite la couche d'interface utilisateur à la navigation dans les associations, déclenchant potentiellement des problèmes de requête N 1.
-
Connexion holding : OSIV peut maintenir la connexion à la base de données tout au long du rendu de l'interface utilisateur, augmentant ainsi la durée du bail de connexion et réduisant les transactions débit.
Considérations sur Spring Boot :
Dans Spring Boot, OSIV est activé par défaut. Il est recommandé de le désactiver en définissant spring.jpa.open-in-view=false dans la configuration de l'application.
Stratégies alternatives pour éviter les exceptions LazyLoad :
Au lieu de OSIV, pensez à :
-
Récupérer des relations avides : Récupérez avec impatience les associations nécessaires à la couche de vue, en vous assurant qu'elles sont chargées lorsque l'entité est récupérée.
-
Récupération explicite dans la couche de service : Utilisez des méthodes telles que fetch() pour récupérer explicitement les associations avant le rendu la vue.
-
Projections : Utilisez des projections pour récupérer uniquement les données nécessaires à la couche de vue, en évitant les paresses inutiles initialisation.
-
API Criteria : Utilisez l'API Criteria pour personnaliser les requêtes et les associations de récupération impatientes.
-
Graphiques d'entité : Définissez des graphiques d'entité pour optimiser la récupération d'associations basées sur des cas d'usage précis.
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!