JDBC——批处理

本文通过实例对比展示了在Java中如何使用JDBC的批量处理机制来提升数据库插入效率。批量处理将多条SQL语句一次性提交,减少了网络开销和编译次数,显著提高了数据插入速度。案例中,批量处理5000条数据仅耗时253ms,相比无批量处理的26106ms,效率提升了近100倍。
摘要由CSDN通过智能技术生成

基本介绍

  1. 当需要成批插入或者更新记录时。可以采用 Java 的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。
  2. JDBC 的批量处理语句包括下面方法:
    1.addBatch() :添加需要批量处理的 SQL 语句或参数
    2.executeBatch() :执行批量处理语句
    3.clearBatch() :清空批处理包的语句
  3. JDBC 连接 MySQL 时,如果要使用批处理功能,请再 url 中加参数?rewriteBatchedStatements=true
  4. 批处理往往和 PreparedStatement 一起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高

案例:批量插入 5000 条数据,比较耗时



package Test;

import org.junit.Test;

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

/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 16:00 2021/9/14
 */
public class Test14 {

    /**
     * 不使用 Batch 耗时:26106 ms
     */
    @Test
    public void noBatch(){
        Connection connection = null;
        String sql = "insert into admin2 values(null, ?, ?)";
        PreparedStatement preparedStatement = null;
        try{
            connection = JDBCUtils.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            System.out.println("开始执行:");
            long start = System.currentTimeMillis();
            for(int i = 0; i < 5000; i++){
                preparedStatement.setString(1, "Gin" + i);
                preparedStatement.setString(2, "4869");
                // 每生成一条 SQL 语句就立即执行
                preparedStatement.executeUpdate();
            }
            long end = System.currentTimeMillis();
            System.out.println("传统方式耗时:" + (end - start) + " ms"); // 传统方式耗时:26106 ms
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null, preparedStatement, connection);
        }

    }

    /**
     * 使用 Batch 批处理 耗时:253 ms
     */
    @Test
    public void useBatch(){
        Connection connection = null;
        String sql = "insert into admin2 values(null, ?, ?)";
        PreparedStatement preparedStatement = null;
        try{
            connection = JDBCUtils.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            System.out.println("开始执行:");
            long start = System.currentTimeMillis();
            for(int i = 0; i < 5000; i++){
                preparedStatement.setString(1, "Gin" + i);
                preparedStatement.setString(2, "4869");
                // 将每一条 SQL 语句都添加到 Batch 中
                /*
                    关于 addBatch() 方法:
                    1. 第一次创建 ArrayList - elementData => Object[]
                    2. elementData => Object[] 就会存放我们预处理的 SQL 语句
                    3. elementData 默认的大小为 10,当存满数据后就按照 1.5 倍扩容
                    4. 当添加到指定的值后,就 executeBatch
                    5. 批量处理会减少我们发送 SQL 语句的网络开销,而且减少编译次数,提高效率
                 */
                preparedStatement.addBatch();
                if((i + 1) % 1000 ==0){
                    // 每满 1000 条数据就执行一次
                    preparedStatement.executeBatch();
                    // 执行完毕后清空 Batch
                    preparedStatement.clearBatch();
                }
            }
            long end = System.currentTimeMillis();
            System.out.println("使用Batch耗时:" + (end - start) + " ms"); // 使用Batch耗时:253 ms
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null, preparedStatement, connection);
        }
    }


}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值