SpringBoot系列(16):线程池-多线程Executors并发编程之批量查询-插入数据

摘要:在上篇文章中Debug给大家分享介绍了“Java线程池-多线程的其中一种应用场景~广播式给所有有效用户发送邮件(通知)”,本篇文章我们将继续向前迈进,继续介绍并实战“线程池-多线程的应用场景”,这一场景简称为“批量插入大量的数据”,同样是采用Java中的Executors下的其中某种线程池进行实战实现!

内容:“批量插入数据”这一业务场景在企业级应用开发中还是比较常见的,顾明思议,即“将给定的大批量的数据插入到指定的数据库中去”,本文我们将采用Java代码、线程池-多线程的方式进行实现,感受一下开辟N个子线程去批量插入数据时的高效之处!

需要指出的是,“待插入的大批量的数据”的某个字段 来源于数据库表“codes”,即字段item_id,在这一业务场景中我们将首先从该数据库表codes中拉取出所有的item_id,然后复制给另外的数据库表item_data中另外的字段code 中去,即实现所谓的“查询-批量插入大批量的数据”。

其中,目标数据库表item_data的DDL定义如下所示:

CREATE TABLE `item_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '编码',
  `p_id` int(11) DEFAULT NULL COMMENT '编号',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据表';

值得一提的是,那些待拉取的数据来源于数据库表codes中,在实战实现“插入大批量的数据”之前,我们写个Java单元测试或者其他的方式往codes表中模拟生成几十万甚至几百万数据记录,即codes数据库表中item_id的取值需要提前大批量生成并插入进去,在这里,我们预先生成的数据量为40w

接下来,我们便进入实际的代码实战实现环节!

(1)首先,我们直接在ThreadController中写一个请求方法,待会儿用于Postman发起“批量插入数据”的请求,其代码如下所示:

    @RequestMapping(value = "all/insert/data",method = RequestMethod.GET)
    public BaseResponse insertAllData(){
        BaseResponse response=new BaseResponse(StatusCode.Success);
        try {
            threadService.insertDatas();

        }catch (Exception e){
            response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
        }
        return response;
    }

(2)threadService.insertDatas(); 即为批量插入大批量数据的实际核心业务逻辑,其完整的核心业务代码如下所示:  

    @Autowired
    private DataMapper dataMapper;

    @Autowired
    private DataService dataService;

    //TODO:批量拉取、插入数据 - 40w
    public void insertDatas() throws Exception{
        //TODO:总线程数 10
        final Integer threadSize=10;

        //TODO:总数据量 40w
        final Long total=dataMapper.getTotal();

        if (total>0){
            //TODO:每个线程将执行插入操作的数据条目
            Long pageSize=(total%threadSize==0)?total/threadSize:total/threadSize+1;

更多请见:http://www.mark-to-win.com/tutorial/51028.html 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值