2008-12-02 7 views
2

Je vais partager une opération de base de données en lecture seule en plusieurs morceaux, (chacun lit un sous-ensemble d'une très grande quantité de données, analyse et écrit les résultats sur un disque fichier).Évitez de délai de connexion lorsque vous utilisez plusieurs threads et pool de connexion

Chaque morceau effectue une sélection (dans un datatable) sur un nouveau thread .net (en utilisant un délégué et BeginInvoke)

Il existe plusieurs sous-ensembles de données que il y a des connexions disponibles dans la piscine, quand je à court de connexions, avant que le premier est libéré, les demandes de connexion suivantes sont mises en attente ... jusqu'à ce que le délai de connexion expire, puis je reçois une exception de délai d'attente. Comment puis-je, A) inhiber l'exception de connexion de délai d'attente lorsque les connexions dans la piscine sont tous en cours d'utilisation, ou B) détecter qu'ils sont tous en cours d'utilisation avant même que je demande un autre, donc je peux attendre jusqu'à ce est disponible avant de demander?

Répondre

1

Deux solutions:

A) Configurez votre pool de connexion avec un délai de plusieurs jours. Cela bloquera les tâches en attente jusqu'à ce qu'une connexion soit renvoyée. Inconvénient: Cela ne fonctionnera pas lorsqu'une tâche se bloque.

b) utiliser un pool de threads et une file d'attente de travail. Le pool de threads doit avoir la même taille que le pool de connexions (c'est-à-dire une connexion par thread). Placez tout le travail dans la file d'attente et demandez aux tâches d'extraire les éléments de travail de la file d'attente jusqu'à ce que la file d'attente soit vide.

pseudocode pour la solution B:

public class Setup 
    connPool = createConnectionPool(100); 
    queue = createWorkQueue(); 
    putAllWorkItemsInQueue(queue); 
    for (int i=0; i<connPool.size(); i++) { 
     t = new WorkerThread(queue) 
     list.add(t); 
     t.start(); 
    } 
    while (queue.size() != 0) { 
     Thread.sleep(1000); 
    } 
    for (thread in list) { 
     thread.interrupt(); 
    } 

public class WorkerThread 
    run() { 
     while (true) { 
      try { 
       workUnit = queue.get(); // This blocks 
       process(workUnit); 
      } catch (InterruptedException e) { 
       break; 
      } 
     } 
    } 
+0

avec option B, ce pool de threads est réglé sur un maximum de 100 fils (depuis la piscine de conections est réglé sur 100), puis, dans mon code où j'appelle BeginInvoke(), je raccroche lorsque tous les 100 threads sont en cours d'utilisation, jusqu'à ce qu'une fin du thread utilisé précédemment et est relâché dans ma piscine de fil? –

Questions connexes