2013-08-07 2 views
2

J'ai une base de données MySQL avec un grand nombre de lignes.Meilleure façon de répartir les tâches de lecture de base de données parmi les threads Java

Je souhaite initialiser plusieurs threads (chacun avec sa propre connexion à la base de données) en Java et lire/imprimer les données simultanément. Comment partitionner des données entre plusieurs threads afin que deux threads ne lisent pas le même enregistrement? Quelles stratégies peuvent être utilisées?

+0

Ces données proviennent-elles de différentes requêtes? – fge

+0

Pourquoi pensez-vous que le multithreading est une bonne solution à ce problème? L'impression des données est le point le moins susceptible d'être le goulot d'étranglement. – Aurand

+0

C'est une sorte de mission pour moi. –

Répondre

0

Vous pouvez utiliser une classe singleton pour conserver les lignes déjà lues. Ainsi, chaque thread peut accéder au numéro de ligne de ce singleton.

Sinon, vous pouvez utiliser la variable AtomicInteger statique d'une classe commune. Chaque fois que les threads appellent la méthode getAndIncrement. Ainsi, vous pouvez partitionner les données entre les threads.

2

Cela dépend du type de travail que vos threads vont faire. Par exemple, j'exécute généralement un seul SELECT pour un type de jeu de données volumineux, j'ajoute des tâches à la file d'attente de tâches sécurisées et je soumets des travailleurs qui sélectionnent la tâche appropriée de la file à traiter. J'écris habituellement à DB sans synchronisation, mais cela dépend de la taille de l'unité de travail, et des contraintes DB (comme les clés uniques, etc.). Fonctionne comme le charme. Une autre méthode consisterait simplement à exécuter plusieurs threads et à les laisser travailler seuls. Je déconseille fortement l'utilisation de certaines LIMITES fantaisistes, OFFSET cependant. DB a encore besoin de récupérer plus de lignes de données que de retour de requête.

EDIT: Comme vous avez ajouté un commentaire que vous avez les mêmes données, que oui, ma solution est ce que vous cherchez

  1. Get ensemble de données par simple requête
  2. Ajouter des données à la file d'attente
  3. Déjeuner vos discussions (par des exécuteurs ou de nouveaux fils)
  4. Choisissez les données de la file d'attente et le traiter.
1

Si le grand ensemble de données a une puis l'une des clé primaire entier , les approches seraient les suivantes

  • obtenir le nombre de lignes en utilisant la même requête de sélection.
  • Diviser l'ensemble de données en un nombre égal de partitions
  • Affectez chaque partition à chaque thead. Chaque thread aura sa propre requête de sélection avec la plage de valeurs de clé primaire comme contrainte.

Note: les questions suivantes avec cette approche

  1. Vous (le nombre d'incendies de fils + 1) requêtes à la base de données. La performance peut donc être un problème.
  2. Toutes les partitions peuvent ne pas être égales (car il y aura certains ID qui sont supprimés).

Cette approche est simple et vérifie qu'une ligne est strictement traitée par un seul thread.

Questions connexes