Résoudre le problème N 1 dans JPA et Hibernate
Dans JPA et Hibernate, un problème de requête N 1 survient lorsque plusieurs requêtes sont exécutées pour récupérer les données associées, ce qui entraîne une récupération de données inefficace. Pour résoudre ce problème, Hibernate propose une gamme de techniques.
Comprendre le problème N 1
Le problème se produit lorsqu'une requête initiale récupère des entités principales et que les requêtes suivantes sont déclenchées pour récupérer les données associées. Par exemple, récupérer les entités PostComment sans précharger l'entité Post associée forcera Hibernate à exécuter des requêtes supplémentaires pour chaque instance Post consultée.
Solution dans Hibernate
1. Récupération de jointure :
En utilisant la stratégie « rejoindre la récupération », les données associées peuvent être récupérées aux côtés des entités principales en une seule requête. Dans notre exemple, nous pouvons utiliser :
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
2. Prélecture de collection :
Lors de la récupération d'une collection d'entités principales et d'une collection supplémentaire de données associées, il est conseillé de préextraire ces dernières. Une option consiste à pré-extraire la collection dans la requête initiale :
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList(); ListpostTags = entityManager.createQuery("select pt from PostTag pt where pt.post in (:commentPosts)", PostTag.class) .setParameter("commentPosts", comments) .getResultList();
3. Requête secondaire :
Dans les cas où la prélecture n'est pas efficace ou où plusieurs associations d'enfants doivent être récupérées, une stratégie de requête secondaire peut être utilisée. Récupérez les entités principales avec une requête de base et utilisez une requête ultérieure pour récupérer les données associées.
Détection automatique avec db-util
La bibliothèque db-util fournit un des moyens automatisés pour détecter le problème de requête N 1. Les assertions JUnit peuvent être utilisées pour valider le nombre attendu d'instructions SQL générées, détectant ainsi le problème dès le début du processus de développement.
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!