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

时间:2008-12-02 14:42:16

标签: multithreading ado.net timeout connection-pooling

我正在将一个只读数据库操作拆分成多个块(每个块读取一个非常大量数据的子集,分析它并将结果写入磁盘文件)。

每个块在新的.net线程上执行Select(进入数据表)(使用委托和BeginInvoke)

数据的子集比池中的可用连接多,所以当我用完连接时,在释放第一个连接之前,后续连接请求排队......直到连接超时到期,并且然后我得到超时异常。

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

1 个答案:

答案 0 :(得分: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;
            }
        }
    }