- 背景:
在最近开发中遇到一个问题,对一个数据库进行操作时,我采用64个并行的任务每个任务保证一个数据库连接对象;但是每个任务内部均包含有24个文件需要读取,在读取文件之后,我们需要快速将这24个文件批量入库到数据库中。
于是我这样开发我的程序:
主任务处理方式:最多允许64并行主任务;
主任务内部子任务采用串行方式:24个文件依次读取,和当前主任务均使用同一个数据库连接字符串。
每个主任务都需要24个文件入库到各自的物理分表中,采用的是串行读取文件资源,串行入库,没有能并行插入24个批处理文件到当前主任务的分表中,感觉到这可能是数据库IO入库速度不高是一个主要因素。
于是包主任务中的24个文件解析入库子任务改为并行方式,结果问题来了:
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
- 排查问题:
1、查看当前数据库已经占用的连接数方法:
A、通过perfiler监控我当前的连接数多少?采用Standard(default)监控模式,stop-》start,每次开始时,就会快速罗列出当前已经建立的连接列表,从列表记录中可以查看到目前数据库实例被占用的数据库连接数。
B、从sys.dm_os_performance_counters中查找
declare @value int; while 1=1 begin waitfor delay '00:00:01' select @value=cntr_value from sys.dm_os_performance_counters where counter_name ='User Connections' print @value; end
从上边的监控中查询出,目前我们的数据库连接数确实就只有100个左右,怎么就出现连