我将只读数据库操作分成多个块,(每个块读取大量数据的子集,对其进行分析并将结果写入磁盘文件)。
每个块在新的 .net 线程(使用委托和 BeginInvoke)上执行 Select(到数据表中)
数据的子集比池中的可用连接多,所以当我用完连接时,在第一个释放之前,后续的连接请求排队...直到连接超时到期,然后我得到超时异常。
我该怎么做,A)当池中的连接都在使用时抑制超时连接异常,或者 B)在我什至请求另一个连接之前检测到它们都在使用,所以我可以等到一个可用时再询问?
我将只读数据库操作分成多个块,(每个块读取大量数据的子集,对其进行分析并将结果写入磁盘文件)。
每个块在新的 .net 线程(使用委托和 BeginInvoke)上执行 Select(到数据表中)
数据的子集比池中的可用连接多,所以当我用完连接时,在第一个释放之前,后续的连接请求排队...直到连接超时到期,然后我得到超时异常。
我该怎么做,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;
}
}
}