欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql批量添加数据

程序员文章站 2022-07-13 13:11:42
...

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
保存