mybatis批量插入oracle大量数据记录性能问题解决
Posted mfmdaoyou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis批量插入oracle大量数据记录性能问题解决相关的知识,希望对你有一定的参考价值。
环境: mybatis + oracle11g r2
1.使用"直接路径插入"(以下sql语句中的"/*+append_values */"),而且使用keyword"union all":
<insert id="addUidCodeBatch" parameterType="java.util.List"> insert into /*+append_values */ T_UID_CODE(C_UID_CODE, C_SERAIL_LEN, C_BATCH_CODE, C_TYPE, C_CREATE_TIME, C_SUPER_CODE, c_security_code, C_SERIAL_CODE ) <foreach collection="list" item="item" index="index" separator="union all" > select #{item.uidCode}, #{item.kCode}, #{item.batchCode}, #{item.type}, sysdate, #{item.superCode}, #{item.securityCode}, #{item.serialCode} from dual </foreach> </insert>
2.dao层实现: 之前是一次性commit,这样做会随着插入数目的增大,运行速度陡然变慢,所以应该分批次进行插入:
public void save(List<UidCodeBean> uidCodeList) throws Exception { SqlSession batchSqlSession = null; try { batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);//获取批量方式的sqlsession int batchCount = 1000;//每批commit的个数 int batchLastIndex = batchCount - 1;//每批最后一个的下标 for(int index = 0; index < uidCodeList.size()-1;){ if(batchLastIndex > uidCodeList.size()-1){ batchLastIndex = uidCodeList.size() - 1; batchSqlSession.insert(NAMESPACE+".addUidCodeBatch", uidCodeList.subList(index, batchLastIndex)); batchSqlSession.commit(); System.out.println("index:"+index+" batchLastIndex:"+batchLastIndex); break;//数据插入完成,退出循环 }else{ batchSqlSession.insert(NAMESPACE+".addUidCodeBatch", uidCodeList.subList(index, batchLastIndex)); batchSqlSession.commit(); System.out.println("index:"+index+" batchLastIndex:"+batchLastIndex); index = batchLastIndex + 1;//设置下一批下标 batchLastIndex = index + (batchCount - 1); } } }finally{ batchSqlSession.close(); } }
以上是关于mybatis批量插入oracle大量数据记录性能问题解决的主要内容,如果未能解决你的问题,请参考以下文章