1、开启mysql的批量处理能力
在连接url后面添加 ?useServerPrepStmts=false&rewriteBatchedStatements=true
如:jdbc:mysql://127.0.0.1:3306/db?useServerPrepStmts=false&rewriteBatchedStatements=true
2、步骤
设置不自动提交 conn.setAutoCommit(false);
编写insert 语句
循环处理数据
提交事务
具体代码如下:
public void addBatch(List<BookInfo> bookInfos, Connection conn){ PreparedStatement pstmt = null; try { String sql = "INSERT INTO `book_info` (`b_field1`,`b_field2`,`b_field3`) VALUES (?,?,?)"; conn.setAutoCommit(false); // 设置手动提交 int count = 0; pstmt = conn.prepareStatement(sql); for (BookInfo bookInfo : bookInfos) { int index = 1; pstmt.setObject(index++, bookInfo.getField1()); pstmt.setObject(index++, bookInfo.getField2()); pstmt.setObject(index++, bookInfo.getField3()); pstmt.addBatch(); // 加入批量处理 count++; } pstmt.executeBatch(); // 执行批量处理 conn.commit(); // 提交 System.out.println("BookInfo addBatch All down : " + count); } catch (Exception e) { LogUtils.error("BookInfo addBatch出错", e);//记录错误日志 try { conn.rollback();//回滚 } catch (SQLException e1) { e1.printStackTrace(); } } finally { DBPoolUtils.closeAll(conn, pstmt);//关闭连接 } }
注意以上bookInfos的大小取决于mysql的my.ini配置,如果数据量很大可以优化配置,具体步骤如下:
修改 bulk_insert_buffer_size=120M 或者更大,默认是8M
将insert语句的长度设为最大。
Max_allowed_packet=1M
Net_buffer_length=8k
保存