SQL数据批量提交的优化和心得

    //通用的批处理sql(预编译)
    public int[] addBatchs(String sql,List<Object[]> ds) { 
    	int[] ls = null;
    	if(ds == null || ds.size() <= 0){ 
            return null; 
        }
    	Connection conn = null;
    	PreparedStatement st = null;
        try { 
    		conn = jdbc.getDataSource().getConnection();
    		//默认每执行一条sql提交一次,消耗太大,所以关闭自动提交。
        	conn.setAutoCommit(false); 
        	//采用预编译SQL,会大幅提升性能。
        	st = conn.prepareStatement(sql); 
        	int x = 0;
        	for(int i=0;i<ds.size();i++){
    			x++;
    			//动态赋值
                        for(int j=0;j<ds.get(i).length;j++) { 
                	    //对于NULL数据进行特殊处理
                            if(ds.get(i)[j] == null || "NULL".equals(ds.get(i)[j])){
                    	        st.setObject(j+1, null);
                            }else{
                    	        st.setObject(j+1, ds.get(i)[j]);
                            }
                        }  
                        st.addBatch();
                        //批次路由控制,每一次批量提交的数量根据评估测试有一个性能和效率的最优值。Oracle是500,Mysql是200
			if(x>500-1){
				x = 0;
				st.executeBatch();
				conn.commit();
			}else{
				if(i == ds.size()-1 && (500-x) >0){
					st.executeBatch();
					conn.commit();
				}
			}
        	}
        } catch (Exception e) { 
            try {
		conn.rollback();
	    } catch (Exception e1) {}
            System.out.println("DB {addBatchs}{Error} "+e.getMessage());
        }finally{
        	try {
        	    st.close();
		    conn.close();
		} catch (Exception e) {
			System.out.println("DB {close}{Error} "+e.getMessage());
		}
        }  
        return ls; 
    }
    
    
    
    使用方式:
    List<Object[]> os = new ArrayList<Object[]>();
    LinkedHashMap<String,Object> ms = null;
    for(int i=0;i<ds.size();i++){
	ms = ds.get(i);
	//基本信息:ID、证件类型、证件号码、姓名、实际出生日期、创建时间
	os.add(new Object[]{ms.get("0"),ms.get("1"),ms.get("2"),ms.get("3")});
    }
    addBatchs("INSERT INTO User(id,zjlx,zjhm,xm) VALUES(?,?,?,?) ",os);
    
    
    测评效果:
    Oracle可以达到每秒1w条数据入库;


你可能感兴趣的:(sql,批处理,批量)