关于jdbc批量操作(addBatch, executeBatch)的测试

  • Post author:
  • Post category:其他


由于项目上有大批量数据插入和更新的操作,所以使用了jdbc的批量操作功能。在此之前参考了很多文章包括jdbc的手册(

https://www.tutorialspoint.com/jdbc/jdbc-batch-processing.htm

),有说需要使用事务的,也有的文章没有使用事务,试了很久,发现代码一直没有按照期望的执行,还是逐条操作数据库。后来在偶然间看到了文章提到需要设置rewriteBatchedStatements为true,加上该参数后搞定!这里记录一下我所做个几个场景的实验,并配有抓包的记录,以显示jdbc批量操作的过程。

测试使用的表结构如下:

create table employees (
  id int(11) unsigned not null auto_increment,
  user_id int(20) not null,
  age int(10) not null,
  first_name varchar(20) not null,
  second_name varchar(20) not null,
  date date not null,
  PRIMARY KEY (id)
) ENGINE=InnoDB CHARSET=utf8;

使用tcpdump抓包,并在wireshark下做分析

场景一:不使用事务,不添加rewriteBatchedStatements=true参数

代码隐去数据库ip、库名、账户名和密码

package jdbcbatchtest;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement pst = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://********:3306/****", "****", "****");
			
			String sql = "insert into employees (user_id, age, first_name, second_name, date) values(?,?,?,?,?)";
			
			pst = conn.prepareStatement(sql);
			
			int loop = 0;
			for(loop = 0; loop < 1000; loop++) {
				pst.setInt(1, loop);
				pst.setInt(2, 18);
				pst.setString(3, "roger");
				pst.setString(4, "zhang");
				pst.setString(5, "2017-01-17");
				pst.addBatch();
			}

			pst.executeBatch();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(pst != null) {
				try {
					pst.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
	

抓包结果:



版权声明:本文为zhangw1236原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。