使用多线程和连接池时避免连接超时
问题描述:
我将只读数据库操作拆分为多个块(每个块读取大量数据的子集,分析它并将结果写入磁盘文件)。使用多线程和连接池时避免连接超时
每个数据块上执行一个新的.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;
}
}
}
与选项B,此线程池设置为100个线程的最大(因为conections池设置为100),然后,在我的代码,我调用BeginInvoke (),当所有100个线程都在使用时,我挂起,直到以前使用的线程完成并释放回我的线程池? – 2008-12-02 15:13:51