首页 > 代码库 > mybatis批量插入oracle大量数据记录性能问题解决
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大量数据记录性能问题解决
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。