zoukankan      html  css  js  c++  java
  • 从数据库中分批取数据的两种方式

    需求:

    从数据库中取出一批数据,比如数据上限是20万,现在要对其进行处理,用多线程分批处理。

    (数据所在表的主键id是递增的【分片数据库自定义的主键自增函数】)

    难点:如何从数据库中分批读取数据,每批之间又无重复数据

    思路1:

    用分页查询的方式取

    先查询出要处理的总数据量 count,然后假设每批要处理1000条,

        int size = 1000;
            int threadNum = count / size + 1;
    
            for (int i = 0; i < threadNum; i++) {
                Map paramMap = new HashMap();
                //分批查询
                paramMap.put("PAGE_INDEX", i*size);
                paramMap.put("PAGE_SIZE", size);
                //用 paramMap 去分页查询数据库
            }

    好处是:每一批数据基本都是数量相同的(除了最后一批)。

    缺点是:

    需要计算分页,查询时还要排序,同时在整个取数据的过程中:

    1、不能对每批获取数据时的条件字段进行更新操作

    2、不能对数据记录进行删除、增加操作】

    思路2:

    用取模的方式取数据

            int size = 1000;
            int threadNum = count / size + 1;
    
            for (int i = 0; i < threadNum; i++) {
                Map paramMap = new HashMap();
                //分批查询
                paramMap.put("threadNum", threadNum);
                paramMap.put("mod", i);
                //用 paramMap 去取模查询数据库
    //  SELECT * FROM `tableName` WHERE id % threadNum = mod ; 即查询条件为 自增主键除以线程数余数为当前遍历到的 i
    }

    好处是:

    查询时无需分页、排序所以速度快,

    在整个取数据过程中,

    1、在一定程度上可以对每批查询条件字段进行更新;

    2、可以对数据记录进行删除操作

    缺点是:主键必须相对连续、每批数据数量可能有很大误差(如果主键不完全连续,比如做过删除操作,或者查询条件不同)】

  • 相关阅读:
    idea中maven自动导入出现问题
    DDIA
    DDIA
    DDIA
    DDIA
    DDIA
    DDIA
    DDIA
    MIT 6.824 第五次作业Primary-Backup Replication
    MIT 6.824 第四次作业GFS
  • 原文地址:https://www.cnblogs.com/libin6505/p/10651549.html
Copyright © 2011-2022 走看看