spring 多线程调用service 获取不到连接

无知的小孩 发布于 2016/10/05 17:44
阅读 831
收藏 1

说明:代码使用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);
}


加载中
0
panmingguang
panmingguang
看普通方法, 非多线程 中 有没有调用service 成功, 就可以判断了,  这和多线程没有关系
panmingguang
panmingguang
回复 @无知的小孩 : 看看是不是事务被关闭了, 听你描述应该是 自动事务, 方法结束后就关闭了
无知的小孩
无知的小孩
回复@panmingguang : 在非线程池中成功的 线程池中在获取连接时 所有连接自动关闭了
返回顶部
顶部