由于项目上有大批量数据插入和更新的操作,所以使用了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 版权协议,转载请附上原文出处链接和本声明。