Bonjour,
Je cherche à améliorer la performance de mes traitements batch ( dizaines de milliers de requêtes).
Quelqu'un a t il un astuce, un retour d’expérience ...
Merci à l'avance
Bonjour,
Je cherche à améliorer la performance de mes traitements batch ( dizaines de milliers de requêtes).
Quelqu'un a t il un astuce, un retour d’expérience ...
Merci à l'avance
Bonjour,
Quel type de performance veux tu améliorer? consommation mémoire ? consommation CPU? temps d’exécution? réduction du nombre d'accès base?
Bonjour,
ça concerne surtout le temps d’exécution.
Alors voila ce que je proposerai:
Remonte dans tes requêtes sql, et essaies de voir si tu peux réduire les accès base, optimise les requêtes pour qu'en une seule passe ca te ramène les résultats de 2 ou 3 passes. Surtout dans les accès base itératifs s'il en existe.Si tu parviens à le faire tu verras déjà un gain de temps de fou car rien de plus lourd en temps d’exécution que les accès base répétés et inutiles.
Effectivement, j'ai des accès base itératifs que je ne peut réduire malheureusement. J'ai vu sur le net qu'une meilleure gestion du "flush" permettrait de gagner du temps sur les opérations de mise à jour.
En ce qui concerne les requêtes "select", je récupérerai seulement les champs dont j'ai besoin ( pas de select *).
Il faudra peut être aussi regarder du coté des propriétés hibernate ( jdbc.batch_size,jdbc.fetch_size ...).
Il faudra tester tout ça avant de tirer une quelconque conclusion.
Pourquoi fais tu des flush dans un batch? je peux comprendre des flush dans une appli web pour une synchro des tables avec les entités managés, mais dans un batch c'est du one-shot normalement, on a besoin d'une entité, on l'extrait, la modifie et commite.Un flush effectivement est non consommateur de mémoire, mais si tu le fais en plus dans une boucle c'est énorme. C'est une fonction à utiliser avec beaucoup de parcimonie.Sans son appel, tes transactions ne sont pas commitées? pour tes rquêtes appelées itérativement je sais que c'est pas évident regarde si tu ne peux pas construire une seule requête avec des group by qui ferait le même taf que dans ton itération.
Montre nous ton code.
Mais effectivement, il faut que tu adaptes la taille de la propriété batch size avec le nombre d'itérations au bout duquel tu flushes et vides la session.
Il y a un chapitre qui explique bien cela dans la documentation.
http://docs.jboss.org/hibernate/orm/..._single/#batch
Spring batch : Facile et assez performant![]()
Au fait, il n'y a pas de code bien précis. Car ce que j'essaye d'optimiser est une surcouche qui gère la persistence. Cette surcouche sera utilisé par plusieurs autres traitements batch.
Sinon, pour les insertions (update) itérative, je crois que comme vous l'aviez dit, le mieux serait de faire un flush et clean chaque fois que le nombre d’itérations dépasse le batch_size.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager