基本介绍
-
当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。 -
JDBC的批量处理语句包括下面方法: addBatch():添加需要批量处理的SQL语句或参数 executeBatch():执行批量处理语句; clearBatch():清空批处理包的语句 因为批量处理的数据量比较大,如果执行的SQL语句特别大,我们需要一批一批执行,清空了一批,再执行一批。 -
JDBC连接MySQL时,如果要使用批处理功能,请再url中加参数?rewriteBatchedStatements=true -
批处理往往和PreparedStatement一起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高。
比如说到现在有3条SQL语句,传统的方式是先发第一条语句给mysql执行,然后第二条,再第三条。
还有一种方式是把这3条语句放在一个集合中,一起发送给mysql,而且在发送之前对sql语句进行处理,很显然,把三条语句发送给mysql执行,效率会高。 举个很简单的例子:校车接送2个孩子,一种方式是接一个孩子到学校然后再饭回去接第二个孩子,另一种方式是2个孩子同时接送到学校。
?
应用实例
向admin2表中添加5000条数据,看看使用批处理耗时多久。 ?
先创建表
create table admin2(
id int primary key auto_increment,
username varchar(32) not null,
password varchar(32) not null
);
select * from admin2;
-- 查询admin2表的引擎
show create table admin2;
传统方法添加5000条数据。
//传统方法,添加5000条数据
@Test
public void noBatch() throws SQLException {
Connection connection = JDBCUtils.getConnection();
String sql = "insert into admin2 values(null,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
System.out.println("开始执行");
long start = System.currentTimeMillis(); //开始时间
for (int i = 0; i < 5000; i++) {
preparedStatement.setString(1,"jack"+i);
preparedStatement.setString(2,"666"+i);
preparedStatement.executeUpdate();
}
long end =System.currentTimeMillis();
System.out.println("传统方式耗时="+(end-start));
JDBCUtils.close(null,preparedStatement,connection);
}
?耗时6524,添加完数据 ?
使用批量方式添加数据。
//使用批量方式添加数据
@Test
public void batch() throws SQLException {
Connection connection = JDBCUtils.getConnection();
String sql = "insert into admin2 values(null,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
System.out.println("开始执行");
long start = System.currentTimeMillis(); //开始时间
for (int i = 0; i < 5000; i++) {
preparedStatement.setString(1,"jack"+i);
preparedStatement.setString(2,"666"+i);
//将sql语句加入到批处理包中
preparedStatement.addBatch();
//当有1000条记录时再批量执行
if ((i+1)%1000==0){ //满1000条
preparedStatement.executeBatch();
//清空一把
preparedStatement.clearBatch();
}
}
long end =System.currentTimeMillis();
System.out.println("批量方式耗时="+(end-start));
JDBCUtils.close(null,preparedStatement,connection);
}
?这快了很多倍,连1秒都不到。 ?
?
?
?
?
?
?
?
?
?
?
?
|