Question d'entretien pour Développeur Java

Votre endpoint émet des centaines de requêtes par appel. Comment cela arrive-t-il avec JPA et comment le corrigez-vous ?

Ce que le recruteur cherche à évaluer, comment structurer votre réponse et un exemple parlé à adapter.

Réponse rapide

C'est le problème du N plus un : une requête charge les lignes parentes, puis toucher une association paresseuse sur chacune déclenche une requête supplémentaire par ligne. Corrigez-le en chargeant l'association dans la même requête avec un join fetch ou un entity graph, en fixant une taille de lot pour que Hibernate charge les associations par groupes, ou en projetant directement dans un DTO avec seulement les colonnes nécessaires. Gardez les associations paresseuses par défaut et chargez de façon anticipée cas d'usage par cas d'usage.

Pourquoi les recruteurs posent cette question

C'est le bug de performance le plus courant dans les applications Spring et Hibernate, donc le recruteur veut savoir si vous le reconnaissez dans les logs et si vous le corrigez sans tout passer en eager. Il veut entendre que la stratégie de chargement appartient à la requête plutôt qu'au mapping, plus une conscience des problèmes voisins : initialisation paresseuse hors session, open session in view, et produits cartésiens quand on joint deux collections.

Comment structurer votre réponse

  • Nommez le motif et expliquez ce qui déclenche les requêtes supplémentaires.
  • Donnez les correctifs dans l'ordre : join fetch, entity graph, taille de lot, projection.
  • Insistez sur le fait que les mappings restent paresseux et que ce sont les requêtes qui décident du chargement.
  • Mentionnez la détection : logguez le SQL ou vérifiez le nombre de requêtes dans les tests.

Exemple de réponse

Exemple parlé, à la première personne

C'est du N plus un. Je charge une page de commandes en une requête, puis le sérialiseur touche order.getItems sur chacune, et comme l'association est paresseuse Hibernate repart chercher pour chaque commande. Vingt commandes deviennent vingt et une requêtes, et ça n'apparaît qu'avec de vraies données. Le premier correctif est de charger ce dont j'ai besoin d'un coup, soit une requête avec un join fetch, soit un entity graph nommé sur la méthode du repository, pour que les lignes reviennent avec leurs parents. Si j'ai besoin de deux collections distinctes, je ne joins pas les deux, parce que ça multiplie les lignes en produit cartésien ; je fixe plutôt une taille de lot pour qu'Hibernate les charge par paquets de cinquante avec une clause in, ce qui fait deux requêtes au lieu de cent. Souvent la vraie réponse est que l'endpoint n'a pas besoin d'entités du tout, donc je projette directement dans un DTO avec juste les colonnes requises. Ce que je ne fais pas, c'est passer le mapping en eager, parce que ça corrige un endpoint et ralentit tous les autres. Je garde le contrôle en vérifiant le nombre de requêtes dans un test d'intégration.

Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.

Voir comment ça marche

Questions de relance à prévoir

  • Qu'est-ce qu'une LazyInitializationException et comment l'évitez-vous correctement ?
  • Pourquoi open session in view est-il considéré comme nuisible ?
  • Comment pagineriez-vous une requête qui fait aussi un join fetch sur une collection ?

Autres questions pour Développeur Java

Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.

Prédire mes questions

Répétez les questions difficiles avant qu'on vous les pose

Entraînez-vous avec un copilote en direct, puis présentez-vous prêt. Un Session Pass à $29 vous accompagne pendant l'entretien, sans abonnement et sans engagement.

Obtenir GhostPilot