Tutoriel sur l'Utilisation du multi-threading dans jdbc
Notre société dispose d'un Lot de l'Application qui s'exécute tous les jours, Il fait un peu de la base de données des emplois liés pour la plupart, d'importer des données dans la table de base de données à partir d'un fichier par exemple.
Il y a+ de 20 tâches définies dans la demande, chacun dépend des autres ou pas.
L'application d'exécuter les tâches une par une, l'ensemble de l'application s'exécute dans un thread unique.
Il faut 3~7 heures pour terminer toutes les tâches. Je pense que c'est trop long, donc je pense que je peux peut-être améliorer les performances en multi-threading.
Je pense qu'il y a dépendance entre les tâches, il n'est pas bon (ou il n'est pas facile) de faire les tâches s'exécutent en parallèle, mais peut-être que je peux utiliser le multi-threading pour améliorer les performances à l'intérieur d'une tâche.
par exemple : nous avons une tâche définie comme "ImportBizData", qui copie les données dans une table de base de données à partir d'un fichier de données(contient généralement 100,0000+ lignes). Je me demande, c'est que la peine d'utiliser le multi-threading?
Que je connais un peu le multi-threading, j'espère que quelqu'un de fournir un tutoriel liens sur ce sujet.
certaines tâches, certaines pas
Votre intuition est juste qu'il vaut la peine de regarder le multithreading. Une fois, j'ai converti une de huit heures de travail par lots dans un 15-20 minutes de travail en faisant exactement ce que vous envisagez de faire.
Moi aussi j'ai le même scénario. Mais je suis confronté à un db verrou de table de problème et le processus est accrochée à chaque fois que je l'exécuter. Avez-vous été confronté à ce genre de problème? Comment peut-il être fixé?
OriginalL'auteur CaiNiaoCoder | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Multi-threading permettra d'améliorer votre performance, mais il ya un couple de choses que vous devez savoir:
commit
de temps en temps pour éviter l'accumulation énorme de restauration/annuler tables.À élaborer un dernier point: à l'heure actuelle, vous avez une tâche qui lit un fichier, analyse, ouvre une connexion JDBC, effectue quelques calculs, envoie les données à la base de données, etc.
Ce que vous devez faire:
Le premier et le dernier fils sont assez lents parce qu'ils sont I/O bound (disques durs sont lents et les connexions réseau sont encore pire). En Plus de l'insertion des données dans une base de données est une tâche très complexe (allocation d'espace, la mise à jour des index, la vérification des clés étrangères)
À l'aide de différents threads de travail vous donne beaucoup d'avantages:
OriginalL'auteur Aaron Digulla
Multi threading peut être de l'aide, si les lignes ne sont pas corrélés, vous pouvez commencer deux modes de lecture même esprit, un autre lignes inégales, et obtenir votre connexion db à partir d'un pool de connexion (dbcp) et analyse de la performance. Mais je souhaite tout d'abord de déterminer si jdbc est la meilleure approche normalement les bases de données ont des solutions optimisées pour les importations de ce genre. Ces solutions peuvent aussi passer temporairement de la vérification des contraintes de votre table, et tourner le dos à plus tard, ce qui est également idéal pour les performances. Comme toujours en fonction de vos besoins.
Aussi, vous ne voulez extraire springbatch qui est conçu pour le traitement par lot.
"normalement, les bases de données ont des solutions optimisées pour les importations comme ça" oui mais dans cette tâche, nous avons besoin de faire un peu de calcul avant d'insérer ou de mettre à jour
Exporter les données, effectuer des calculs et de créer un fichier d'importation.
OriginalL'auteur dr jerry
Autant que je sache,le Pont JDBC utilise synchronisé des méthodes pour sérialiser tous les appels ODBC donc l'utilisation de plusieurs threads ne vous donnera aucun gain de performance, à moins que cela renforce votre application elle-même.
Ah oui, j'ai travaillé beaucoup avec JDBC-ODCB pont dernièrement que j'ai presque oublié qu'il y a le pilote natif des implémentations trop 🙂
OriginalL'auteur Tobi
Je suis pas du tout familier avec JDBC mais en ce qui concerne le multithreading peu de votre question, ce que vous devez garder à l'esprit est que le traitement parallèle repose sur la division du problème en morceaux qui sont indépendants l'un de l'autre et d'une certaine manière de les mettre ensemble (leur sortie). Si vous ne connaissez pas le sous-jacent des dépendances entre les tâches que vous pourriez finir par avoir vraiment bizarre erreurs/exceptions dans votre code. Pire encore, il pourrait s'exécutent sans problème, mais les résultats peuvent être de vraies valeurs. Le Multi-threading est un travail délicat, dans une façon amusante d'apprendre (au moins je le pense), mais la douleur dans le cou quand les choses vont vers le sud.
Voici quelques liens qui pourraient fournir des informations utiles:
Si vous êtes sérieux au sujet de mettre des efforts pour entrer dans le multi-threading, je peux vous recommander GOETZ, BRIAN: JAVA SIMULTANÉITÉ, super livre vraiment..
Bonne chance
OriginalL'auteur posdef
J'ai eu un tâche similaire. Mais dans mon cas, toutes les tables étaient pas liés les uns aux autres.
ETAPE 1:
À l'aide de SQL Loader(Oracle) pour le téléchargement des données dans la base de données(très rapide), OU de toute autre mise à jour en bloc outils pour votre base de données.
ETAPE 2:
L'exécution de chaque processus de transfert dans un autre thread(pour les tâches distinctes) et dans un seul fil pour tâches connexes.
P. S. Vous pourriez identifier les différents inter-liées à un emploi dans votre application et de les classer dans des groupes; et de l'exécution de chaque groupe dans des threads différents.
Les liens pour exécuter votre place:
JAVA Threading
suivez le dernier exemple dans le lien ci-dessus(Exemple: Partitionnement d'un gros groupe avec plusieurs threads)
SQL Loader peut considérablement améliorer les performances
OriginalL'auteur Pravat Panda
Le moyen le plus rapide que j'ai trouvé pour insérer un grand nombre d'enregistrements dans Oracle est avec les opérations de matrice. Voir le "setExecuteBatch" la méthode, qui est spécifique à OraclePreparedStatement. Il est décrit dans l'un des exemples ici:
http://betteratoracle.com/posts/25-array-batch-inserts-with-jdbc
OriginalL'auteur Jeff Grigg
Si le Multi threading ne ferait que compliquer votre travail, vous pourriez aller avec Async messagerie. Je ne suis pas pleinement conscients de ce que vos besoins sont, donc, ce qui suit est ce que je vois actuellement.
Vous n'avez pas à traiter avec des fils dans l'ensemble du processus, de JMS est idéal parce que vos données sont à l'intérieur d'une transaction, si quelque chose tombe en panne avant de vous envoyer un accusé de réception au serveur, le message sera envoyé de nouveau à la consommation, la charge sera répartie entre les serveurs sans vous faire quelque chose de spécial comme les multi-threading.
Aussi, le printemps est de fournir printemps-lot, ce qui peut vous aider. http://docs.spring.io/spring-batch/reference/html/spring-batch-intro.html#springBatchUsageScenarios
OriginalL'auteur Zeus