SpringCloud配置sharding-jdbc 千万级别的数据进行数据拆分

原理不多说 ,直接上代码吧。

 

1:

 

执行方法  一次只查1000条数据,当总数达到一万的时候 进行线程执行。

//获取原有数据  进行数据拆分
@TrackingTime  //自己实现的接口实现时间记录
public  Integer getAllVisit(){
    String id="0";
    List tempSeoKeywordList=null;//每次查询的结果
    List seoKeywordList=new ArrayList<>();
    boolean isFinish=false;
    while (!isFinish) {
        try {
            if(redisUtil.hasKey(RedisKeyConstant.MESSAGE_USER_VISIT_ID_KEY)){
                id=String.valueOf(redisUtil.get(RedisKeyConstant.MESSAGE_USER_VISIT_ID_KEY));
            }
            while (true) {
                tempSeoKeywordList = userVisitorRepository.getAllVisit(id);
                if (tempSeoKeywordList == null || tempSeoKeywordList.size() == 0) {
                    isFinish = true;
                    break;
                }
                seoKeywordList.addAll(tempSeoKeywordList);
                id = tempSeoKeywordList.get(tempSeoKeywordList.size() - 1).getId();
                if (seoKeywordList.size() == 10000) break;//每十万条数据  启动线程插入
            }
            if (seoKeywordList.size() != 0) {
                operationHistoryData.batchAddData(seoKeywordList);
                redisUtil.set(RedisKeyConstant.MESSAGE_USER_VISIT_ID_KEY, seoKeywordList.get(seoKeywordList.size() - 1).getId());
                seoKeywordList.clear();
            }
        } catch (Exception e) {
            isFinish = true;
            log.info("聚合特征词扔到队列任务执行失败------");
            e.printStackTrace();
        }
    }
    return 0;
}

 

2:涉及到的线程类

 

@Service
public class OperationHistoryData {
    

    
    private CountDownLatch threadsSignal;
    //每个线程处理的数据量
    private static final int count=1000;
    @Autowired
    UserVisitorService userVisitorService;
    
    //定义线程池数量为8,每个线程处理1000条数据
    private static ExecutorService execPool = Executors.newFixedThreadPool(8);
    
    /**
     * 多线程批量执行插入,   64位4核处理
     * @param request
     * @return
     */
    public String batchAddData(List limodel) {
        //存放每个线程的执行数据
        //List newlist = null;
        //需要插入数据库的数据
        try {
            
            if(limodel.size()<=count) {
                threadsSignal=new CountDownLatch(1);
                execPool.submit(new InsertDate(limodel));
            }else {
                List> li=createList(limodel, count);
                threadsSignal=new CountDownLatch(li.size());
                for(List liop:li) {
                    execPool.submit(new InsertDate(liop));
                }
            }
            threadsSignal.await();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        
        return "";
    }
    
    /**
     * 数据拆分
     * @param targe
     * @param size
     * @return
     */
    public static List>  createList(List targe,int size) {
        List> listArr = new ArrayList>();
        //获取被拆分的数组个数  
        int arrSize = targe.size()%size==0?targe.size()/size:targe.size()/size+1;  
        for(int i=0;i  sub = new ArrayList();
            //把指定索引数据放入到list中  
            for(int j=i*size;j<=size*(i+1)-1;j++) {  
                if(j<=targe.size()-1) {  
                    sub.add(targe.get(j));  
                }  
            }  
            listArr.add(sub);  
        }  
        return listArr;  
     }  
    
    
    /**
     * 内部类,开启线程批量保存数据
     * @author liguobao
     *
     */
    class  InsertDate  extends Thread{

        List lientity=new ArrayList();
        
        public  InsertDate(List limodel){
            lientity=limodel;
        }
        
        public void run() {
            userVisitorService.batchInsertUserVisit(lientity);
            threadsSignal.countDown();
        }
    }   
}

 

3:实现的sql.

SELECT
        id,
        created_date,
        last_updated_date,
        uid ,
        vuid,
        number,
        visit_flag
        FROM
        user_visitor_t_test_0
        WHERE
        id > '10680093031570997248'
        ORDER BY id
        LIMIT 1000

 

 

备注提示:

sharding  不支持批量插入。 所以大家要注意避免采坑。  因为不是批量,所以处理一千多万条数据  大概要花一个小时左右。

 

如有疑问 加QQ吧  976452322

你可能感兴趣的:(SrpingBoot技术总结,java)