Mybatis 大数据量的批量insert解决方案
方案一,直接利用mybatis mapper的api
@Service
public class ProposedService{
@Autowired
SqlSessionFactory sqlSessionFactory;
@Transactional
public void insertBatch(List<TRiskToleranceAnswer> tRiskToleranceAnswerList) {
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
TRiskToleranceAnswerMapper mapper = sqlSession.getMapper(TRiskToleranceAnswerMapper.class);
for (int i = 0; i < tRiskToleranceAnswerList.size(); i++) {
mapper.insertSelective(tRiskToleranceAnswerList.get(i));
}
sqlSession.flushStatements();
}
}
100000条记录 65秒 9个字段 springboot2.0.7 mybatis3.4.6 postgresql9.4
方案二,自定义insert into table values (xxx,xxx,…)
<insert id="insertBatch" parameterType="java.util.List">
insert into t_risk_tolerance_answer (<include refid="Base_Column_List" /> )
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.proposedCd,jdbcType=VARCHAR}, #{item.seq,jdbcType=INTEGER}, #{item.question,jdbcType=VARCHAR},
#{item.answer,jdbcType=ARRAY,typeHandler=handler.ArrayTypeHandler},
#{item.deleteFlg,jdbcType=VARCHAR}, #{item.createDt,jdbcType=TIMESTAMP}, #{item.createUserId,jdbcType=VARCHAR},
#{item.updateDt,jdbcType=TIMESTAMP}, #{item.updateUserId,jdbcType=VARCHAR})
</foreach>
</insert>
@Service
public class ProposedService {
@Autowired
SqlSessionFactory sqlSessionFactory;
@Transactional
public void insertBatch(List<TRiskToleranceAnswer> tRiskToleranceAnswerList) {
int groupSize = 500;
int groupNo = tRiskToleranceAnswerList.size() / groupSize;
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
TRiskToleranceAnswerMapper mapper = sqlSession.getMapper(TRiskToleranceAnswerMapper.class);
if (tRiskToleranceAnswerList.size() <= groupSize) {
mapper.insertBatch(tRiskToleranceAnswerList);
} else {
List<TRiskToleranceAnswer> subList=null;
for (int i = 0; i < groupNo; i++) {
subList = tRiskToleranceAnswerList.subList(0, groupSize);
mapper.insertBatch(subList);
tRiskToleranceAnswerList.subList(0, groupSize).clear();
}
if (tRiskToleranceAnswerList.size() > 0) {
mapper.insertBatch(tRiskToleranceAnswerList);
}
}
sqlSession.flushStatements();
}
}
100000条记录 19秒 9个字段 springboot2.0.7 mybatis3.4.6 postgresql9.4