使用多线程和连接池时避免连接超时

问题描述:

我将只读数据库操作拆分为多个块(每个块读取大量数据的子集,分析它并将结果写入磁盘文件)。使用多线程和连接池时避免连接超时

每个数据块上执行一个新的.NET线程选择(成一个DataTable)(使用委托和的BeginInvoke)

有数据的多个子集以外还有池中可用连接,所以当我在第一个连接请求释放之前,连接请求排队等待,直到连接超时到期,然后出现超时异常。

我该如何:A)当连接池中的连接全部被使用时,禁止超时连接异常,或者B)在我甚至要求另一个连接之前检测到它们全部被使用,所以我可以等到一个在询问之前是否可用?

两个解决方案:

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,此线程池设置为100个线程的最大(因为conections池设置为100),然后,在我的代码,我调用BeginInvoke (),当所有100个线程都在使用时,我挂起,直到以前使用的线程完成并释放回我的线程池? – 2008-12-02 15:13:51