zoukankan      html  css  js  c++  java
  • 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();
    		}		
    	}





  • 相关阅读:
    动态代理方案性能对比(转载)
    Java类的初始化
    第78天:jQuery事件总结(一)
    第77天:jQuery事件绑定触发
    第76天:jQuery中的宽高
    第75天:jQuery中DOM操作
    第74天:jQuery实现图片导航效果
    第73天:jQuery基本动画总结
    第72天:jQuery实现下拉菜单
    第71天:jQuery基本选择器(二)
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6905449.html
Copyright © 2011-2022 走看看