批处理应用
基本介绍:
1.当需要成批插入或更新记录时,可以采用java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交事务更有效率
2.JDBC的批量处理语句包括下面方法
addBatch():添加需要批量处理的SQL语句或参数
executeBatch();执行批量处理语句
chearBatch();清空批量处理包的语句
3.JDBC连接MySQL时,如果要使用批处理功能,请在url中添加参数(?rewriteBatchedStatements=true)
4.批处理往往和PreparedStatement一起搭配使用,可以减少编译次数,也可以减少运行次数,效率会提高很多
演示向admin02表中添加信息
package com.jh.batch_;
//演示java的批处理
import com.jh.jdbc.JDBCUtils;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Batch_ {
//传统方法,添加100条数据到admin02表中
@Test
public void noBatch() throws SQLException {
//得到连接
Connection connection = JDBCUtils.getConnection();
//组织SQL语句
String sql = "insert into admin02 values(null,?,?)";
//创建预处理对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
System.out.println("开始执行...");
//起始时间
long start = System.currentTimeMillis();
//添加100条信息
for (int i = 0; i < 100; i++) {
preparedStatement.setString(1,"cat" + i);
preparedStatement.setString(2,"123");
//执行
preparedStatement.executeUpdate();
}
//结束时间
long end = System.currentTimeMillis();
System.out.println("传统方法耗时时间:" + (end - start));
//关闭连接
JDBCUtils.close(null,preparedStatement,connection);
}
//使用批处理方式添加数据
@Test
public void batch() throws SQLException {
//得到连接
Connection connection = JDBCUtils.getConnection();
//组织SQL语句
String sql = "insert into admin02 values(null,?,?)";
//创建预处理对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
System.out.println("开始执行...");
//起始时间
long start = System.currentTimeMillis();
//添加100条信息
for (int i = 0; i < 100; i++) {
preparedStatement.setString(1,"DOG" + i);
preparedStatement.setString(2,"123");
//将sql语句加入到批处理中
preparedStatement.addBatch();
//判断当有50条时,进行批量处理
if((i+ 1) % 50 == 0){
//进行批量处理
preparedStatement.executeBatch();
//清空批处理包
preparedStatement.clearBatch();
}
}
//结束时间
long end = System.currentTimeMillis();
System.out.println("批量处理方法耗时时间:" + (end - start));
//关闭连接
JDBCUtils.close(null,preparedStatement,connection);
}
}
配置文件信息:
传统方法耗时:
使用批处理方式耗时:
批处理源码分析:
1.先创建ArrayList再调用elementData->Object[]
2.elementData->Object[] 会存放预处理的SQL语句
3.当elementData满后,将会按照原来的1.5倍进行扩容
4.当添加到指定的值后,就executeBatch来批量处理SQL语句
5.批量处理会减少发送SQL语句的网络开销,而且减少编译次数,因此效率将会提高