MyBatis - 批量INSERT

XML文件

<insert id ="insertBatch" parameterType="java.util.List">
    <selectKey resultType ="java.lang.Integer" keyProperty= "id"
               order= "AFTER">
      SELECT LAST_INSERT_ID()
    </selectKey >
    INSERT INTO message_user
    (user_id, message_id, create_time)
    values
    <foreach collection ="list" item="model" index= "index" separator =",">
      (
      #{model.userId}, #{model.messageId}, #{model.createTime}
      )
    </foreach >
</insert >

JAVA代码

// 部分代码
messageService.insert(message);
int messageId = message.getId();
int size = userIdList.size();
int startIndex = 0;
// MAX_BATCH_REQUEST: 最大批处理请求数
int endIndex = MAX_BATCH_REQUEST;
while (startIndex <= size) {
    if (endIndex > size) {
        endIndex = size;
    }
    List<String> subItems = userIdList.subList(startIndex, endIndex);
    List<MessageUser> modelList = new ArrayList<>();
    for (String obj : subItems) {
        if (StringUtils.isEmpty(obj)) continue;
        MessageUser mu = new MessageUser();
        mu.setUserId(new BigDecimal(obj).intValue());
        mu.setMessageId(messageId);
        mu.setCreateTime(now);
        modelList.add(mu);
    }
    // 调用Service方法
    messageUserService.insertBatch(modelList);
    startIndex += MAX_BATCH_REQUEST;
    endIndex += MAX_BATCH_REQUEST;
}

TIPS

  1. 批处理时,应该打点,那样系统中断后可以续存
  2. 如果是对响应有要求的系统,可以开多个线程,或者另起一个job执行批处理
  3. 最大请求数不能太大,否则会给DB很大压力
  4. 关于事务问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值