JDBC批量插入優化addbatch

//  獲取要設置的Arp基準的List後,插入Arp基準表中 	
	public boolean insertArpStandardList(List<ArpTable> list) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		//MySql的JDBC鏈接的url中要加rewriteBatchedStatements參數,並保證5.1.13以上版本的驅動,才能實現高性能的批量插入。
		//優化插入性能,用JDBC的addBatch方法,可是注意在鏈接字符串加上面寫的參數。
		//例如: String connectionUrl="jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true" ; 
		
		String sql = "insert into arp_standard(guid, devicebrand, devicename, deviceip, ipaddress, " +
				     "macaddress, createtime) values(?,?,?,?,?,?,?)";
		
		try{
			conn = DBConnection.getConnection();
			ps = conn.prepareStatement(sql);
			
			//優化插入第一步		設置手動提交   
			conn.setAutoCommit(false);  
			
			int len = list.size();
			for(int i=0; i<len; i++) {
				ps.setString(1, list.get(i).getGuid());
				ps.setString(2, list.get(i).getDeviceBrand());
				ps.setString(3, list.get(i).getDeviceName());
				ps.setString(4, list.get(i).getDeviceIp());
				ps.setString(5, list.get(i).getIpAddress());
				ps.setString(6, list.get(i).getMacAddress());
				ps.setString(7, list.get(i).getCreateTime());
				
				//if(ps.executeUpdate() != 1) r = false;	優化後,不用傳統的插入方法了。
				
				//優化插入第二步		插入代碼打包,等必定量後再一塊兒插入。
				ps.addBatch();  
				//if(ps.executeUpdate() != 1)result = false;
			    //每200次提交一次  
			    if((i!=0 && i%200==0) || i==len-1){//能夠設置不一樣的大小;如50,100,200,500,1000等等   
				    ps.executeBatch();   
				    //優化插入第三步		提交,批量插入數據庫中。
				    conn.commit();   
				    ps.clearBatch();     	//提交後,Batch清空。
			    }
			}

		} catch (Exception e) {
			System.out.println("MibTaskPack->getArpInfoList() error:" + e.getMessage());
			return false;	//出錯才報false
		} finally {
			DBConnection.closeConection(conn, ps, rs);
		}
		return true;
	}

  效率要比一條一條插入快近60倍。好比for循環或者insert into table test select * from....mysql

相關文章
相關標籤/搜索