我正在将一个只读数据库操作拆分成多个块(每个块读取一个非常大量数据的子集,分析它并将结果写入磁盘文件)。
每个块在新的.net线程上执行Select(进入数据表)(使用委托和BeginInvoke)
数据的子集比池中的可用连接多,所以当我用完连接时,在释放第一个连接之前,后续连接请求排队......直到连接超时到期,并且然后我得到超时异常。
我如何,A)在池中的连接全部被使用时禁止超时连接异常,或者B)在我甚至要求另一个之前检测到它们全部被使用,所以我可以等到一个是问之前可用?
答案 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;
}
}
}