群插,数据分组后sql批量插入,大批量数据插入数据库,方法汇总与思路优化

2 篇文章 0 订阅

分别是

1.普通方法
2.mybatis的方法,拼接插入参数,一次性插入
3.通过原生的jdbc连接设置,然后打开批量处理的方式去处理数据

链接: 三种方法详细介绍

链接中,我比较相中第二种,
但,第二种经过有人的测试,
发现当同时进行200条及其以上的拼接插入时,消耗的时间指数级别上升!
……
所以为什么不优化一下?


以下是第二种方法的优化

下面这个方法就是对数据源进行分组

调用的方法

/**
	 * 将一组数据平均分成n组
	 *
	 * @param source 要分组的数据源
	 * @param n      平均分成n组
	 * @param <T>
	 * @return
	 */
	public static <T> List<List<T>> averageAssign(List<T> source, int n) {
		List<List<T>> result = new ArrayList<List<T>>();
		int remainder = source.size() % n;  //(先计算出余数)
		int number = source.size() / n;  //然后是商
		int offset = 0;//偏移量
		for (int i = 0; i < n; i++) {
			List<T> value = null;
			if (remainder > 0) {
				value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
				remainder--;
				offset++;
			} else {
				value = source.subList(i * number + offset, (i + 1) * number + offset);
			}
			result.add(value);
		}
		return result;
	}

serviceImpl

	int n=(array.size()/200)+1;//总数据量除200 得出分成多少组的200条数据
	List<List<ObjectStatus>> lists = new ArrayList<>();
	//objectStatuseslist 是我的一个储存对象的列表
	lists=SplitListUtil.averageAssign(objectStatuseslist,n);
	//for循环插入一次循环插入200条
	for(int i = 0; i < n; i++){
try {
		omr.insertList(lists.get(i));
	} catch (Exception e) {
	e.printStackTrace();
	}
	System.out.println("插入"+i+"组成功!");
						}

dao

//批量插入
	int insertList(@Param("list") List<ObjectStatus> list);

Mapper

 <insert id="insertList" parameterType="java.util.List" >
    insert into objectstatus ( hostName, filePath,
                              fileName, md5, size,
                              status, checkResult, lastCheck,
                              bh, depotid, isRecovery, isbq, ismsg
    )
    values
    <foreach collection="list" item="list"  index="index" separator=",">
      (
       #{list.hostname,jdbcType=VARCHAR},
      #{list.filepath,jdbcType=VARCHAR},
      #{list.filename,jdbcType=VARCHAR},
      #{list.md5,jdbcType=VARCHAR},
      #{list.size,jdbcType=BIGINT},

      #{list.status,jdbcType=INTEGER},
      #{list.checkresult,jdbcType=VARCHAR},
      #{list.lastcheck,jdbcType=VARCHAR},
      #{list.bh,jdbcType=VARCHAR},

      #{list.depotid,jdbcType=INTEGER},
      #{list.isrecovery,jdbcType=INTEGER},
      #{list.isbq,jdbcType=INTEGER},
      #{list.ismsg,jdbcType=INTEGER}
       )
    </foreach>
  </insert>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值