使用多线程及线程池批量拷贝数据到MongoDB

一给  金牌会员 | 2022-9-16 17:18:30 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

@
目录

提示:本文仅供学习交流,请勿用于非法活动!
<font color="#999AAA">
一、原来代码

如下,我们将拷贝100万条数据到MongoDB中。
<font color="#999AAA">
  1. public void copyCartToMongo() {
  2.    List<Cart> carts = cartMapper.selectAll();
  3.    if(carts.size() >0 ){
  4.       cartMongoService.saveCartList(carts);
  5.    }
  6. }
复制代码
二、改进后代码
  1. public void copyCartToMongoByThread() {
  2.         // 1.我们先将批量查询及拷贝的数据分批
  3.    EntityWrapper<Cart> wrapper = SQLHelper.buildEmptyWrapper(Cart.class);
  4.    long count = cartMapper.selectCount(SQLHelper.build(Cart.class).geEntityWrapper());
  5.    int preCount = 100;
  6.    int operateCount = 0;
  7.    int num = operateCount = (int)count / preCount;
  8.    if(count % preCount == 0){
  9.       operateCount = num;
  10.    }else {
  11.       operateCount = num + 1;
  12.    }
  13.    for(int i=0;i<operateCount;i++){
  14.       logger.info("保存或更新第"+(i+1)*preCount+"条数据");
  15.       Page<Cart> page = new Page<>(i,preCount);
  16.       List<Cart> cartList = cartMapper.selectPage(page, wrapper);
  17.       // 2.通过多线程、线程池(其他替换即可)
  18.       this.copyCartToMongoThread(cartList);
  19.    }
  20. }
复制代码
2.使用Runnable接口

代码如下:
<font color="#999AAA">
  1. public void copyCartToMongoThread(List<Cart> cartList){
  2.       final CountDownLatch latch = new CountDownLatch(cartList.size());
  3.       try{
  4.          for(Cart cart:cartList){
  5.             Thread thread = new Thread(() -> {
  6.                cartMongoService.saveCart(cart);
  7.                latch.countDown();
  8.             });
  9.             thread.start();
  10.          }
  11.          latch.await();
  12.       } catch (Exception e) {
  13.          e.printStackTrace();
  14.       }
  15.    }
复制代码
3.使用线程池

代码如下:
<font color="#999AAA">
  1. public void copyCartToMongoThread(List<Cart> cartList){
  2.         final CountDownLatch latch = new CountDownLatch(cartList.size());
  3.         try {
  4.             for (Cart cart:cartList){
  5.                 new Thread(new Runnable() {
  6.                     @Override
  7.                     public void run() {
  8.                         cartMongoService.saveCart(cart);
  9.                         latch.countDown();
  10.                     }
  11.                 }).start();
  12.             }
  13.             latch.await();
  14.         } catch (InterruptedException e) {
  15.             e.printStackTrace();
  16.         }
  17.     }
复制代码
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表