MySQL数据库10秒内插入百万条数据的实现


Posted in MySQL onNovember 01, 2021

首先我们思考一个问题:

要插入如此庞大的数据到数据库,正常情况一定会频繁地进行访问,什么样的机器设备都吃不消。那么如何避免频繁访问数据库,能否做到一次访问,再执行呢?

Java其实已经给了我们答案。

这里就要用到两个关键对象:StatementPrepareStatement

我们来看一下二者的特性:

MySQL数据库10秒内插入百万条数据的实现

要用到的BaseDao工具类 (jar包 / Maven依赖) (Maven依赖代码附在文末)(封装以便于使用)

MySQL数据库10秒内插入百万条数据的实现

注:(重点)rewriteBatchedStatements=true,一次插入多条数据,只插入一次!!

public class BaseDao {  //  静态工具类,用于创建数据库连接对象和释放资源,方便调用
    //    导入驱动jar包或添加Maven依赖(这里使用的是Maven,Maven依赖代码附在文末)
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
 
    //  获取数据库连接对象
    public static Connection getConn() {
        Connection conn = null;
        try {
            //  rewriteBatchedStatements=true,一次插入多条数据,只插入一次
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/million-test?rewriteBatchedStatements=true", "root", "qwerdf");
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }
 
    //  释放资源
    public static void closeAll(AutoCloseable... autoCloseables) {
        for (AutoCloseable autoCloseable : autoCloseables) {
            if (autoCloseable != null) {
                try {
                    autoCloseable.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

接下来上关键代码及注释:

/*  因为数据库的处理速度是非常惊人的 单次吞吐量很大 执行效率极高
    addBatch()把若干sql语句装载到一起,然后一次送到数据库执行,执行需要很短的时间
    而preparedStatement.executeUpdate() 是一条一条发往数据库执行的 时间都消耗在数据库连接的传输上面*/
public static void main(String[] args) {
    long start = System.currentTimeMillis();    //  获取系统当前时间,方法开始执行前记录
    Connection conn = BaseDao.getConn();        //  调用刚刚写好的用于获取连接数据库对象的静态工具类
    String sql = "insert into mymilliontest values(null,?,?,?,NOW())";  //  要执行的sql语句
    PreparedStatement ps = null;
    try {
        ps = conn.prepareStatement(sql);    //  获取PreparedStatement对象
        //  不断产生sql
        for (int i = 0; i < 1000000; i++) {
            ps.setString(1, Math.ceil(Math.random() * 1000000) + "");
            ps.setString(2, Math.ceil(Math.random() * 1000000) + "");
            ps.setString(3, UUID.randomUUID().toString());  //  UUID该类用于随机生成一串不会重复的字符串
            ps.addBatch();  //  将一组参数添加到此 PreparedStatement 对象的批处理命令中。
        }
        int[] ints = ps.executeBatch();//   将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
        //  如果数组长度不为0,则说明sql语句成功执行,即百万条数据添加成功!
        if (ints.length > 0) {
            System.out.println("已成功添加一百万条数据!!");
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        BaseDao.closeAll(conn, ps);  //  调用刚刚写好的静态工具类释放资源
    }
    long end = System.currentTimeMillis();  //  再次获取系统时间
    System.out.println("所用时长:" + (end - start) / 1000 + "秒");  //  两个时间相减即为方法执行所用时长
}

最后我们运行看一下效果:

MySQL数据库10秒内插入百万条数据的实现

MySQL数据库10秒内插入百万条数据的实现

嘿嘿,这里时长超过了10秒,设备差点意思,希望理解哈~

MySQL数据库10秒内插入百万条数据的实现

<!--连接数据库所用到的mysql-connector-java依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>

PS : 添上线程后会更快,在后续的文章中会作示例。

到此这篇关于MySQL数据库10秒内插入百万条数据的实现的文章就介绍到这了,更多相关MySQL 插入百万条数据 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
教你用eclipse连接mysql数据库
Apr 22 MySQL
MySQL数字类型自增的坑
May 07 MySQL
MySQL 如何分析查询性能
May 12 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 MySQL
MySQL面试题讲解之如何设置Hash索引
MySQL对数据表已有表进行分区表的实现
Nov 01 #MySQL
mysql分表之后如何平滑上线详解
Nov 01 #MySQL
MySQL8.0升级的踩坑历险记
Nov 01 #MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 #MySQL
mysql事务对效率的影响分析总结
Oct 24 #MySQL
mysql事务隔离级别详情
You might like
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
使用php来实现网络服务
2009/09/15 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
xml转json的js代码
2012/08/28 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
Javascript URI 解析介绍
2015/03/15 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
微信小程序input抖动问题的修复方法
2021/03/03 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python 格式化输出百分号的方法
2019/01/20 Python
pandas数据集的端到端处理
2019/02/18 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
django序列化serializers过程解析
2019/12/14 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
掌上明珠Java程序员面试总结
2016/02/23 面试题
员工评语大全
2014/01/19 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
新文化运动的口号
2014/06/21 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
高中生物教学反思
2016/02/20 职场文书
七年级作文之秋游
2019/10/21 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android