Traitez en flux plutôt que de tout matérialiser : lisez avec un curseur défilant ou une pagination par clé, fixez une taille de fetch pour que le pilote ne bufferise pas tout, et traitez par blocs avec un commit par bloc. Avec JPA, videz le contexte de persistance entre les blocs ou utilisez une session sans état, sinon chaque entité reste dans le cache de premier niveau. Groupez les écritures avec le batching JDBC, et rendez le traitement redémarrable depuis son dernier bloc commité.
Pourquoi les recruteurs posent cette question
Les traitements par lots sont là où le comportement mémoire de la JVM et celui du contexte de persistance deviennent évidents, donc cela teste l'expérience pratique plutôt que la théorie. Le recruteur veut le flux, les commits par blocs, le nettoyage du contexte de persistance et la redémarrabilité. Savoir qu'un pilote JDBC peut bufferiser tout le jeu de résultats quoi que fasse votre code, sauf si la taille de fetch et les réglages de transaction sont bons, est un signal fort.
Comment structurer votre réponse
- Excluez de tout charger : lisez en flux ou par pages.
- Expliquez la taille de fetch et le comportement de buffering du pilote.
- Gérez le contexte de persistance pour que les entités ne s'accumulent pas.
- Ajoutez les commits par blocs, les écritures groupées et la redémarrabilité.
Exemple de réponse
La règle centrale, c'est qu'aucune étape ne détient vingt millions de quoi que ce soit. Je lis avec une pagination par clé sur la clé primaire, ou un curseur défilant avec une taille de fetch explicite, et il faut savoir que certains pilotes ignorent ça et bufferisent tout le jeu de résultats sauf si vous êtes aussi dans une transaction avec l'autocommit désactivé, ce que les gens découvrent à la dure quand le tas se remplit avant que le moindre traitement ne commence. Ensuite je traite par blocs de quelques milliers, j'écris avec le batching JDBC pour avoir un aller-retour par bloc plutôt que par ligne, et je commite par bloc. Avec JPA le piège en plus, c'est le contexte de persistance : chaque entité lue reste gérée, donc la mémoire grimpe et les flushs ralentissent à mesure que la détection de modifications parcourt plus d'objets. Je le vide à chaque bloc ou j'utilise une session sans état. La redémarrabilité compte autant que la mémoire, donc le traitement enregistre la dernière clé commitée, ce qui veut dire qu'un échec à la dix-huit millionième ligne reprend au lieu de tout recommencer. Et je le bride, parce qu'un traitement par lots qui sature la base à deux heures du matin touche quand même ceux qui sont réveillés.
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 marcheQuestions de relance à prévoir
- Pourquoi le contexte de persistance ralentit-il à mesure qu'il grossit ?
- Comment paralléliseriez-vous cela sans risque entre partitions ?
- Comment rendez-vous la transformation idempotente pour un redémarrage ?
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