JAVA executeBatch 批量插入最优方案

 

最近在做一些大批量插入的工具,参考了一些文章,具体优化需要注意以下几点:

 

1、JDBC连接URL需要使用rewriteBatchedStatements,驱动会自动将插入SQL转化成"insert into t (…) values (…) , (…), (…)"的形式插入,提高效率,需要注意在5.1.13以上版本才能生效,URL=jdbc:mysql://localhost:2433/test?rewriteBatchedStatements=true。

 

2、setAutoCommit 使用事务性提交

 

3、addBatch 可以将多次的PreparedStatement积累到一起再提交发送,参照mysql的最大包接收进行优化。

 

 

public static void insert() throws SQLException, IOException,
		ParseException {
	Connection conn = getConn();
	if (conn != null) {
		List<String> idList = getAllId();
		String sql = "INSERT INTO `xxx` (`id`,`countDate`,`volume`) VALUES (?,?,?)";

		for (String id : idList) {
			conn.setAutoCommit(false);//事务提交数据库更快
			PreparedStatement pstmt = conn.prepareStatement(sql);
			for (String result : resultList) {
				String[] data = result.split(",");
				try {
					pstmt.setString(1, id);
					SimpleDateFormat formatter = new SimpleDateFormat(
							"yyyy-MM-dd");
					Date date = formatter.parse(data[0]);
					pstmt.setDate(2, new java.sql.Date(date.getTime()));
					pstmt.setInt(3,0);

					pstmt.addBatch();//每次把sql积累到一定数量才一次执行executeBatch,另外可以控制每次提交的数据包大小
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			pstmt.executeBatch();
			conn.setAutoCommit(true);
			w.end();
		}
	}
}

 

 

你可能感兴趣的:(批量插入,executeBatch)