Maison >Java >javaDidacticiel >Devriez-vous utiliser la session ouverte d'Hibernate dans View Pattern ?

Devriez-vous utiliser la session ouverte d'Hibernate dans View Pattern ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-25 10:39:15903parcourir

Should You Use Hibernate's Open Session in View Pattern?

Les inconvénients du modèle de session ouverte en vue d'Hibernate

Le modèle de session ouverte en vue d'Hibernate (OSIV) maintient une session ouverte tout au long de la durée d'une requête. cycle de vie. Bien que cette approche puisse sembler pratique, elle comporte plusieurs pièges :

1. Absence de contrôle transactionnel
OSIV permet la manipulation de données en dehors des transactions gérées, entraînant des incohérences de données. Chaque instruction exécutée pendant le rendu de l'interface utilisateur se produit en mode de validation automatique, ce qui augmente la surcharge d'E/S et compromet potentiellement les performances de la base de données.

2. Mélange de préoccupations
OSIV brouille la séparation entre les couches de service et d'interface utilisateur, car les déclarations sont générées par les deux. Cela complique les tests et rend plus difficile l'isolation des couches.

3. Problèmes de performances des requêtes N 1
OSIV limite la couche d'interface utilisateur à la navigation dans les associations, ce qui peut entraîner des problèmes de requête N 1. Bien qu'Hibernate fournisse des atténuations telles que @BatchSize et FetchMode.SUBSELECT, elles affectent le plan de récupération par défaut et peuvent ne pas être optimales pour tous les scénarios.

4. Gestion des ressources
OSIV maintient la connexion à la base de données ouverte tout au long de la phase de rendu de l'interface utilisateur. Ce bail de connexion étendu peut créer une congestion dans le pool de connexions, limitant l'évolutivité et le débit.

Alternatives à OSIV

Pour éviter les LazyLoadExceptions tout en répondant aux limites d'OSIV, considérez ces stratégies alternatives :

  • Récupération impatiente : Tout initialiser les associations requises avec impatience dans la couche de service pour éviter les erreurs de chargement paresseux.
  • FetchMode.JOIN : Utilisez FetchMode.JOIN dans les requêtes pour charger avec impatience des associations spécifiques.
  • Récupération par lots : Utilisez @BatchSize pour récupérer les associations par lots et améliorer performances.
  • Projection DTO : Créez des DTO (objets de transfert de données) qui encapsulent les données pertinentes sans inclure d'associations paresseuses.

Désactivation d'OSIV dans Spring Boot

Dans Spring Boot, OSIV est activé par défaut. Pour le désactiver, ajoutez la propriété suivante à votre fichier de configuration application.properties :

spring.jpa.open-in-view=false

En désactivant OSIV, vous pouvez mieux contrôler la récupération des données, garantir l'intégrité des transactions et améliorer les performances des applications.

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!

Déclaration:
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