首页 > 其他分享 >jdbc-批量插入百万数据-5秒

jdbc-批量插入百万数据-5秒

时间:2023-10-07 09:23:04浏览次数:38  
标签:jdbc java 批量 插入 Connection sql import conn

package com.swift.aaa;

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

import org.junit.Test;

public class APP1 {

    public static void main(String[] args) throws Exception {
        
        //1.加载MySQL数据库驱动包
//        Class.forName("com.mysql.jdbc.Driver");
//        //2.连接MySQL数据库服务器
//        Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/oa", "root", "root");
//        //3.创建执行语句对象
//        Statement st = conn.createStatement();
//        //4.执行语句
//        st.executeUpdate("INSERT INTO `user` SET username='刘诗华 77154113',password=28");
//        //5.释放资源
//        st.close();
//        conn.close();
        
        
        bulkSubmissionTest4();

    }
    
    public static Connection getConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/oa", "root", "root");
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    
    
    
    
    /**
     * 方式一
     * 普通批量插入,直接将插入语句执行多次即可
     * @throws Exception 
     */
    @Test
    public void bulkSubmissionTest1() throws Exception {
        long start = System.currentTimeMillis();//开始计时【单位:毫秒】
        Connection conn =getConnection();//获取数据库连接
        String sql = "INSERT INTO `user` SET username=?,password=?";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 1; i <= 1000000; i++) {
                ps.setObject(1, i);//填充sql语句种得占位符
                ps.setObject(2, i);//填充sql语句种得占位符
                ps.execute();//执行sql语句
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            conn.close();
        }
        //打印耗时【单位:毫秒】
        System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");
    }
    
    
    /**
     * 方式二
     * 在方式一的基础上使用批处理
     * 使用PreparedStatement ps;的
     *      ps.addBatch();      将sql语句打包到一个容器中
     *      ps.executeBatch();  将容器中的sql语句提交
     *      ps.clearBatch();    清空容器,为下一次打包做准备
     * 这三个方法实现sql语句打包,累计到一定数量一次提交
     * @throws Exception 
     */
    @Test
    public void bulkSubmissionTest2() throws Exception {
        long start = System.currentTimeMillis();
        Connection conn = getConnection();//获取数据库连接
        String sql = "insert into a(id, name) VALUES (?,null)";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 1; i <= 1000000; i++) {
                ps.setObject(1, i);
                ps.addBatch();//将sql语句打包到一个容器中
                if (i % 500 == 0) {
                    ps.executeBatch();//将容器中的sql语句提交
                    ps.clearBatch();//清空容器,为下一次打包做准备
                }
            }
            //为防止有sql语句漏提交【如i结束时%500!=0的情况】,需再次提交sql语句
            ps.executeBatch();//将容器中的sql语句提交
            ps.clearBatch();//清空容器
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            conn.close();
        }
        System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");
    }
    
    
    
    public static Connection getConnection2() {
    
        String url="jdbc:mysql://localhost:3306/oa?characterEncoding=utf8&serverTimezone=UTC&useSSL=false&rewriteBatchedStatements=true";
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, "root", "root");
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
        
        /**
     * 方式三
     * 在方式二的基础上允许重写批量提交语句,获取连接的url需加上
     * 【&rewriteBatchedStatements=true】(重写批处理语句=是)
         * @throws Exception 
     */
    @Test
    public void bulkSubmissionTest3() throws Exception {
        long start = System.currentTimeMillis();
        Connection conn = getConnection();//获取数据库连接
        String sql = "INSERT INTO `user` SET username=?,password=?";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 1; i <= 1000000; i++) {
                ps.setObject(1, i);
                ps.setObject(2, i);
                ps.addBatch();
                if (i % 500 == 0) {
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            ps.executeBatch();
            ps.clearBatch();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            conn.close();
        }
        System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");
    }
    
    
    
    /**
     * 方式四
     * 在方式三的基础上,取消自动提交sql语句,当sql语句都提交了才手动提交sql语句
     * 需将Connection conn;连接的【conn.setAutoCommit(false)】(设置自动提交=否)
     * @throws SQLException   String sql = "INSERT INTO `user` SET username=?,password=?";
     */
    @Test
    public static void bulkSubmissionTest4() throws SQLException {
        long start = System.currentTimeMillis();
        Connection conn = getConnection2();//获取数据库连接
        String sql = "INSERT INTO user(username,password) values(?,?)";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            conn.setAutoCommit(false);//取消自动提交
            for (int i = 1; i <= 5000000; i++) {
                ps.setObject(1, i);
                ps.setObject(2, i);
                ps.addBatch();
                if (i % 10000 == 0) {
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            ps.executeBatch();
            ps.clearBatch();
            conn.commit();//所有语句都执行完毕后才手动提交sql语句
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            conn.close();
        }
        //truncate table user;
        //select count(*) from user;
        System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");
    }

}

 

标签:jdbc,java,批量,插入,Connection,sql,import,conn
From: https://www.cnblogs.com/hua900822/p/17745507.html

相关文章

  • git 批量操作/处理冲突/conflict
    https://www.cnblogs.com/JourneyOfFlower/p/16650697.html......
  • 【自动化批量操作 | 易班课群】自动收集课群作业 & 自动创建课群 & 自动查看课群号
    ......
  • linux 中 prefetch命令批量下载sra测序数据
     001、prefetch的安装  002、准备下载sra号的列表  003、设置下载存储目录  004、下载命令 。 参考:https://codeleading.com/article/83981102254/......
  • C++ 数据结构插入效率学习
    转自:https://blog.csdn.net/breaksoftware/article/details/829478381.总结在头部插入。元素数量>15k时,效率unordered_set>set,unordered_map>map。元素数量<1024时,效率unordered_set>set,map> unordered_map。元素数量<256时,效率unordered_set>set,map> unorder......
  • 站群通过bat脚本批量绑定ip
    以绑定192.168.1.192/26为例 先通过计算ip地址 获取到第一个和最后一个可用ip尾数为193和254,以及掩码255.255.255.192,并注意服务器上网络连接名称,加入以下批处理脚本保存为ip.bat运行即可。 @echo offfor /l %%a in (193,1,254) do netsh interface ip add a......
  • 【基础算法】排序算法 —— 插入排序
    一、算法原理插入排序将数组分为已排序区间和未排序区间,初始已排序区间只有数组第1个元素,未排序区间从下标1开始到数组末尾。每次取未排序区间的第1个元素,将它插入已排序区间的合适位置,并保证已排序区间一直有序。重复这个过程,直到未排序区间为空,算法结束。给有序数组(已排序区......
  • Java JDBC连接数据库的CURD操作(JDK1.8 + MySQL8.0.33 + mysql-connector-java-8.0.27-
    JDBC概述JDBC(JavaDatabaseConnectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。JDBC为访问不同的数据库提供了一......
  • 批量造数据
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ charc[1000005]; srand(time(0)); for(inti=1;i<=19;i++){ sprintf(c,"%d.in",i); freopen(c,"w",stdout); …………………… fclose(stdin); sprintf(c,"%d.out",i......
  • 插入排序:简单而有效的排序方法
    在计算机科学中,排序算法是一个重要且常见的主题,它们用于对数据进行有序排列。插入排序(InsertionSort)是其中一个简单但有效的排序算法。本文将详细解释插入排序的原理和步骤,并提供Java语言的实现示例。插入排序的原理及性能分析插入排序的核心思想是逐个将未排序的元素插入到已排序......
  • 掌握这些技巧,让Excel批量数据清洗变得简单高效!
    什么是数据清洗数据清洗是指在数据处理过程中对原始数据进行筛选、转换和修正,以确保数据的准确性、一致性和完整性的过程。它是数据预处理的一部分,旨在处理和纠正可能存在的错误、缺失值、异常值和不一致性等数据质量问题。为什么要数据清洗Excel在数据采集场景中非常常用。作......