3

我将只读数据库操作分成多个块,(每个块读取大量数据的子集,对其进行分析并将结果写入磁盘文件)。

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

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

我该怎么做,A)当池中的连接都在使用时抑制超时连接异常,或者 B)在我什至请求另一个连接之前检测到它们都在使用,所以我可以等到一个可用时再询问?

4

1 回答 1

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;
            }
        }
    }
于 2008-12-02T14:50:32.267 回答