Spring Batch : Tasklet avec multi threaded exécuteur testamentaire est très mauvaises performances liées à la Limitation de l'algorithme de
À l'aide de Spring batch 2.2.1, j'ai configuré un Spring Batch Job, j'ai utilisé cette approche:
Configuration est la suivante:
- Tasklet utilise ThreadPoolTaskExecutor limité à 15 threads
- gaz-limite est égal au nombre de threads
- Bloc est utilisé avec:
- 1 synchronisé adaptateur de JdbcCursorItemReader pour permettre son utilisation par de nombreux threads comme par Spring Batch documentation recommandation
Vous pouvez synchroniser l'appel à read() et aussi longtemps que le traitement et l'écriture est la partie la plus coûteuse de la partie de votre étape peut encore terminer beaucoup plus rapidement que dans un seul thread de configuration.
- saveState est fausse JdbcCursorItemReader
- Personnalisé ItemWriter basée sur la JPA. Noter que le traitement d'un élément peut varier en termes de temps de traitement, il peut prendre quelques millis à quelques secondes ( > 60).
- commettre l'intervalle de mise à 1 (je sais que ça pourrait être mieux, mais c'est pas la question)
- 1 synchronisé adaptateur de JdbcCursorItemReader pour permettre son utilisation par de nombreux threads comme par Spring Batch documentation recommandation
- Tous jdbc piscines sont très bien, à propos de Spring Batch doc recommandation
L'exécution du lot mène à la très étrange et de mauvais résultats pour les raisons suivantes:
- à une certaine étape, si les éléments à prendre du temps pour traiter par un écrivain, presque tous les threads du pool de threads finissent par ne rien faire au lieu de traitement, seulement la lenteur de l'écrivain est de travail.
Regarder Spring Batch de code, la cause semble être dans ce package:
- org/springframework/lot/répétition/support/
Est cette façon de travailler d'une fonction ou est-ce une limitation/bug ?
Si c'est une fonction, ce qui est la façon par la configuration de tous les threads sans être affamés par le long travail de traitement sans avoir à réécrire tout ?
Noter que si tous les éléments prennent le même temps, tout fonctionne bien et le multi-threading est OK, mais si une de l'élément le traitement prend beaucoup plus de temps, puis multi-threading est à peu près inutile pour le moment, le lent processus fonctionne.
Remarque, j'ai ouvert ce problème:
OriginalL'auteur pmpm | 2013-08-15
Vous devez vous connecter pour publier un commentaire.
Comme Alex l'a dit, il semble que ce comportement est un contrat par javadoc :
Regardez:
Une autre option pour vous serait d'utiliser le Partitionnement :
Michael Minella explique dans le Chapitre 11 de son livre Pro Spring Batch:
Partitioner.java:
OriginalL'auteur UBIK LOAD PACK
Voici ce que je pense est d'aller sur:
En d'autres termes, pour ce multi-thread approche Spring Batch pour être utile, chaque thread doit traiter environ la même quantité de temps. Compte tenu de votre scénario où il y a une énorme disparité entre le temps de traitement de certains éléments, vous êtes confronté à une limitation de nombreux de votre fils sont complets et en attente sur une longue frère thread pour être en mesure de passer à la partie suivante de la transformation.
Ma suggestion:
Un suivi de ma précédente réponse - si vous essayez d'élargir votre pool de threads dans la façon dont je l'ai suggéré que vous pourriez commencer à obtenir beaucoup de non validées transactions de base de données depuis chaque thread va traiter un morceau entre les commet. Juste quelque chose à considérer comme un échange.
OriginalL'auteur Alex
Dans mon cas, si je n'ai pas mis la manette des gaz-limite, seulement 4 threads venir dans la méthode read() de ItemReader qui est aussi le nombre de threads par défaut, si rien n'est spécifié dans la tasklet balise comme par Ressort documentation du Lot.
Si je spécifier plusieurs threads e.g 10, 20 ou 100, puis seulement 8 threads venir dans la méthode read() de ItemReader
OriginalL'auteur Harsh Gupta
La limite de 8 threads actifs quelle que soit la valeur de commande de puissance-limite peut être causée par la contention de Spring Batch Job référentiel. Chaque fois qu'un bloc est traité certaines info est écrit dans job référentiel. Augmenter sa piscine de taille pour accueillir le nombre de threads qu'il vous faut!
OriginalL'auteur Filoche