2008-12-02 2 views
2

Я делясь операцией базы данных readonly на несколько фрагментов (каждый из которых считывает подмножество очень большого количества данных, анализирует его и записывает результаты на диск файл).Избегайте таймаута подключения при использовании нескольких потоков и пула подключений

Каждый блок выполняет Select (в DataTable) на новый .net нить (с помощью делегата и BeginInvoke)

Есть еще подмножества данных, чем имеется в наличии соединения в пуле, поэтому, когда я заканчиваются соединения, до того, как первый будет выпущен, последующие запросы на подключение будут помещены в очередь ... до истечения времени ожидания соединения, а затем я получу исключение тайм-аута.

Как я либо: A) блокирует исключение соединения с таймаутом, когда все соединения в пуле все используются, или B) обнаруживают, что все они используются до того, как я попрошу еще одного, поэтому я могу подождать, пока один доступно перед запросом?

ответ

1

Два решения:

A) Настройка пула соединений с тайм-аут в несколько дней. Это блокирует ожидающие задачи до тех пор, пока соединение не будет возвращено. Недостаток: это не будет работать при зависании задачи.

B) Используйте пул потоков и рабочую очередь. Пул потоков должен иметь тот же размер, что и пул соединений (т. Е. Одно соединение для потока). Положите всю работу в очередь и попросите задания извлечь рабочие элементы из очереди до тех пор, пока очередь не будет пуста.

псевдокод для решения 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

с опцией B, этот Thread Pool установлен макс 100 нитей (так как бассейн conections установлен на 100), а затем, в моем коде, где я называю BeginInvoke(), Я вишу, когда используются все 100 потоков, до тех пор, пока ранее используемый поток не завершится и не будет выпущен обратно в мой пул потоков? – 2008-12-02 15:13:51

Смежные вопросы