引言
mybatis 每次批量新增的数量是越大越好吗,怎么选择每次批量新增的数量,以下实验告诉你
1 背景
某功能模块,一个请求需要入库30万测点,http超时设置了20s,批量新增,超过20s后tcp连接断开,前端判定失败,页面操作出现异常,需要接口在20s内处理完毕并返回结果
2 方案设计
1)同步方案,批量新增需要在20s内完成,批量新增有三种方式,轮训单次新增、foreach拼接、session提交。
2)异步方案,收到请求后,任务状态变更为正在进行中,返回数据并提示“正在创建任务,请耐心等待”,同时启用线程处理入库数据,入库完成后更改任务状态
3 方案对比
1)同步方案
第一种轮训单次新增30万次,单单交互时间损耗就达到不可思议的地步,不可取
for(T t:objects){
mapper.save(t);
}
或者
objects.stream().foreach(object->{mapper.save(object)});
第二种获取sql session factory类,轮训列表,每次将数据放入session中,当session数据超过n时,提交持久化session里面的数据
@Autowired
private SqlSessionFactory sqlSessionFactory;
private final int BATCH_SIZE=10