2011-03-31 3 views
3

Nous développons un système de suivi des véhicules dans lequel plusieurs appareils GPS continuent d'envoyer leurs emplacements GPS au serveur via la connexion TCP. Le communicateur TCP décode l'emplacement GPS et insère ces données dans la base de données. À l'heure actuelle, un thread de TCP communicateur sert une demande de périphérique. Après décodage des données GPS, il crée une connexion à la base de données et insère les données et libère la connexion. À mesure que le nombre de périphériques augmente, le nombre de connexions simultanées à la base de données (MySQL) augmente également. Par conséquent, je veux mettre en œuvre une file d'attente où chaque thread de TCP communicateur poussera les données à une extrémité et un travail prendra des données de l'autre extrémité et de garder l'insertion dans la base de données.Mise en place de file d'attente pour les données à insérer dans la base de données

Quelqu'un peut-il me suggérer la meilleure solution pour gérer tout cela? Notre application est basée sur Java et la base de données est MySQL.

Merci, Saurabh

+0

... Erm message Mise en attente. – Lazarus

Répondre

2

Vous pouvez utiliser une implémentation de file d'attente thread-safe comme ConcurrentLinkedQueue à la file d'attente les données

0

Vous devez mettre en œuvre une file d'attente de messages. Voir RabbitMQ ou ActiveMQ.

2

Vous pouvez simplement créer un Thread simple qui gère la base de données écrit. Ensuite, vos threads communicateurs mettent en file d'attente les données qui doivent être écrites avec. Quelque chose comme ceci:

public class DatabaseQueue extends Thread { 
    private LinkedBlockingQueue<Data> queue = new LinkedBlockingQueue<Data>(); 

    public void queueData(Data data) { 
     queue.add(data); 
    } 

    public void run() { 
     while (true) { 
      Data data = queue.take(); 
      // write data to database 
     } 
    } 
} 
1

Une file d'attente concurrente simple est préférable si vous allez lot vos données et soutenir les techniques de dosage facile (et à cet effet les performances d'insertion de base de données)

Cependant, une approche plus souple si vous voulez faire d'autres choses aussi bien utiliser un ExecutorService avec un nombre fixe de threads. De cette façon, vous pouvez ajouter des tâches pour faire n'importe quoi, à un degré limité de concurrence.

0

un emploi prendra des données de l'autre extrémité et garder l'insertion dans la base de données .

ConcurrentLinkedQueue est juste un surpuissant, il est plus d'un fil pour accéder à la méthode de verrouillage free.The poll prendre des intervalles de sommeil inutiles, aussi u besoin d'attendre jusqu'à ce que la file d'attente est remplie, encore un autre type de sommeil. Si vous avez un seul thread mettre des choses dans la file d'attente, et un autre thread prendre des choses hors de la file d'attente

Queue<GPRSObj> queue = Collections.synchronizedList(new LinkedList<GPRSObj>()); 

ou

LinkedBlockingQueue 
Questions connexes