spring 多线程调用service 获取不到连接
说明:代码使用spring3+Druid+ibatis;使用spring 自带线程池调用业务层jdbc操作,主要实现从oracle查询数据添加到mysql(没有用愚公,oracle是客户的库 给的账号只有查询数据的权限)
关键代码
1.<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心线程数 -->
<property name="corePoolSize" value="${task.core_pool_size}" />
<!-- 最大线程数 -->
<property name="maxPoolSize" value="${task.max_pool_size}" />
<!-- 队列最大长度 -->
<property name="queueCapacity" value="${task.queue_capacity}" />
<!-- 线程池维护线程所允许的空闲时间,默认为60s -->
<property name="keepAliveSeconds" value="${task.keep_alive_seconds}" />
</bean>
#------------ Task ------------
task.core_pool_size=5
task.max_pool_size=50
task.queue_capacity=1000
task.keep_alive_seconds=60
2.
final NamedParameterJdbcTemplate jdbc = new NamedParameterJdbcTemplate(dataSourceOracle);
taskExecutor.execute(new Runnable() {
public void run() {
aService.batInsert(jdbc);//问题片段
}
});
3.public void batInsert(NamedParameterJdbcTemplate jdbc) {
int rn = 0;
int rownum = 1000;
int size = 1000;
Map<String,Object> param = new HashMap<String, Object>();
param.put("rn", rn);
param.put("rownum", rownum);
//spring+ibatis 问题主要部分获取数据源时错误提示信息是已关闭
List<表对应实体> lst = baseDao.queryForList("sqlmapid.listBeanByParam",param);
do{
if(lst != null && lst.size() >0)
{
System.out.println("执行[],批量新增["+rn+"]["+rownum+"]");
SqlParameterSource[] pss = SqlParameterSourceUtils.createBatch(lst.toArray());
jdbc.batchUpdate(sql, pss);
rn += size;
rownum += size;
param.put("rn", rn);
param.put("rownum", rownum);
lst = baseDao.queryForList("sqlmapid.listBeanByParam",param);
}
}while(lst != null && lst.size() >0);
}