Résoudre efficacement le problème N 1 dans JPA et Hibernate
Le problème de requête N 1 se produit lorsqu'une requête initiale récupère N enregistrements, et les suivantes des requêtes sont exécutées pour récupérer les enregistrements relationnels associés à chacun de ces N enregistrements. Surmonter ce problème dans Hibernate nécessite une approche globale.
Comprendre le problème
Le problème de requête N 1 survient lorsque vous récupérez des enregistrements sans initialiser une relation associée. Lorsque vous tentez ultérieurement d'accéder à cette relation, Hibernate exécute des requêtes supplémentaires pour récupérer les informations requises. Cela entraîne l'exécution de N 1 requêtes au lieu d'une seule requête.
Résoudre le problème
Pour résoudre ce problème dans Hibernate, la solution efficace consiste à utiliser JOIN FETCH clause. En ajoutant cette clause à votre requête initiale, vous pouvez récupérer rapidement la relation à l'origine du problème :
List<PostComment> comments = entityManager.createQuery( "select pc from PostComment pc join fetch pc.post p where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
Dans les cas où vous devez récupérer plusieurs associations d'enfants, il est conseillé de récupérer une collection dans la requête principale et les autres dans des requêtes distinctes.
Automatisation de la détection
Pour détecter de manière transparente la requête N 1 problèmes, il est fortement recommandé d'incorporer des assertions JUnit automatiques dans vos tests d'intégration. Des outils tels que db-util fournissent un utilitaire open source permettant de valider le nombre d'instructions SQL générées, garantissant ainsi que votre code ne souffre pas sans le savoir de ce goulot d'étranglement en termes de performances.
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!