mysql数据库准备

private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";private String user = "root";private String password = "root";Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;//封装与数据库建立连接的类public void coon() throws Exception{Class.forName(Driver);connection = DriverManager.getConnection(url,user,password);}//封装异常类public void erro(){try {if (rs!=null){rs.close();}if (ps!=null){ps.close();}if (connection!=null){connection.close();}} catch (Exception e) {e.printStackTrace();}}

方式一:普通插入

package com.wt;import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** @Author wt* @Date 2022/11/14 21:17* @PackageName:com.wt* @ClassName: TestAddBatch01* @Description: TODO* @Version 1.0*/
public class TestAddBatch01 {private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai";private String user = "root";private String password = "root";Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;public void coon() throws Exception{Class.forName(Driver);connection = DriverManager.getConnection(url,user,password);}public void erro(){try {if (rs!=null){rs.close();}if (ps!=null){ps.close();}if (connection!=null){connection.close();}} catch (Exception e) {e.printStackTrace();}}@Testpublic void ccc(){long start = System.currentTimeMillis();String sql = "insert into a(id, name) VALUES (?,null)";try {coon();ps = connection.prepareStatement(sql);for (int i = 1; i <= 1000000; i++) {ps.setObject(1, i);//填充sql语句种得占位符ps.execute();//执行sql语句}} catch (Exception e) {e.printStackTrace();} finally {erro();}System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");}}

用时:62分钟多

方式二:使用批处理插入

package com.wt;import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** @Author wt* @Date 2022/11/14 20:25* @PackageName:com.wt.util* @ClassName: TestAddBatch* @Description: TODO* @Version 1.0*/
public class TestAddBatch {private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai";private String user = "root";private String password = "root";Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;public void coon() throws Exception{Class.forName(Driver);connection = DriverManager.getConnection(url,user,password);}public void erro(){try {if (rs!=null){rs.close();}if (ps!=null){ps.close();}if (connection!=null){connection.close();}} catch (Exception e) {e.printStackTrace();}}@Testpublic void ccc(){long start = System.currentTimeMillis();String sql = "insert into a(id, name) VALUES (?,null)";try {coon();ps = connection.prepareStatement(sql);
//            connection.setAutoCommit(false);//取消自动提交for (int i = 1; i <= 1000000; i++) {ps.setObject(1, i);ps.addBatch();if (i % 1000 == 0) {ps.executeBatch();ps.clearBatch();}}ps.executeBatch();ps.clearBatch();
//            connection.commit();//所有语句都执行完毕后才手动提交sql语句} catch (Exception e) {e.printStackTrace();} finally {erro();}System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");}}

 方式一、二总结:到此可以看出其实其处理程序及批处理是没有起作用的,为此我们使用方式三

方式三:通过连接配置url设置【&rewriteBatchedStatements=true】(设置重写批处理语句)

url地址后注意添加【&rewriteBatchedStatements=true】

private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";

方法三较于方法二的改变是只是url地址上的改变,其它没有任何修改

package com.wt;import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** @Author wt* @Date 2022/11/14 20:25* @PackageName:com.wt.util* @ClassName: TestAddBatch* @Description: TODO* @Version 1.0*/
public class TestAddBatch {private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";private String user = "root";private String password = "root";Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;public void coon() throws Exception{Class.forName(Driver);connection = DriverManager.getConnection(url,user,password);}public void erro(){try {if (rs!=null){rs.close();}if (ps!=null){ps.close();}if (connection!=null){connection.close();}} catch (Exception e) {e.printStackTrace();}}@Testpublic void ccc(){long start = System.currentTimeMillis();String sql = "insert into a(id, name) VALUES (?,null)";try {coon();ps = connection.prepareStatement(sql);for (int i = 1; i <= 1000000; i++) {ps.setObject(1, i);ps.addBatch();if (i % 1000 == 0) {ps.executeBatch();ps.clearBatch();}}ps.executeBatch();ps.clearBatch();} catch (Exception e) {e.printStackTrace();} finally {erro();}System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");}}

用时:【10秒左右】

到此批处理语句才正是生效

注意

数据库连接的url设置了【&rewriteBatchedStatements=true】时,java代码种的sql语句不能有分号【;】号,否则批处理语句打包就会出现错误,导致后面的sql语句提交出现【BatchUpdateException】异常

方式四:通过数据库连接取消自动提交,手动提交数据

package com.wt;import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** @Author wt* @Date 2022/11/14 20:25* @PackageName:com.wt.util* @ClassName: TestAddBatch* @Description: TODO* @Version 1.0*/
public class TestAddBatch {private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";private String user = "root";private String password = "root";Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;public void coon() throws Exception{Class.forName(Driver);connection = DriverManager.getConnection(url,user,password);}public void erro(){try {if (rs!=null){rs.close();}if (ps!=null){ps.close();}if (connection!=null){connection.close();}} catch (Exception e) {e.printStackTrace();}}@Testpublic void ccc(){long start = System.currentTimeMillis();String sql = "insert into a(id, name) VALUES (?,null)";try {coon();ps = connection.prepareStatement(sql);connection.setAutoCommit(false);//取消自动提交for (int i = 1; i <= 1000000; i++) {ps.setObject(1, i);ps.addBatch();if (i % 1000 == 0) {ps.executeBatch();ps.clearBatch();}}ps.executeBatch();ps.clearBatch();connection.commit();//所有语句都执行完毕后才手动提交sql语句} catch (Exception e) {e.printStackTrace();} finally {erro();}System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");}}

用时:【9秒左右】

总结:

1.使用批量提交数据,url一定要设置允许重写批量提交【rewriteBatchedStatements=true】,以及此时的sql语句一定不能有分号,否则有【BatchUpdateException】异常,

2.其他的就正常使用PreparedStatement ps;的以下三个方法即可
     *      ps.addBatch();      将sql语句打包到一个容器中
     *      ps.executeBatch();  将容器中的sql语句提交
     *      ps.clearBatch();    清空容器,为下一次打包做准备

MySQL十秒插入百万条数据相关推荐

  1. mysql 存储过程查询优化_mysql用存储过程插入百万条数据, 及查询优化

    查看所有存储过程: show procedure status; 查看详细存储过程 ptest: show create procedure ptest; 存储过程插入数据: create table ...

  2. 【SpringBoot项目中使用Mybatis批量插入百万条数据】

    SpringBoot项目中使用Mybatis批量插入百万条数据 话不多说,直接上代码,测试原生批处理的效率 开始测试 背景:因为一些业务问题,需要做多数据源,多库批量查询.插入操作,所以就研究了一下. ...

  3. 如何往数据库快速插入百万条数据

    具体逻辑实现: 创建两个表,一个内存表,一个数据表 然后将百万数据先存入内存表,再在内存表数据导入数据表 数据库默认好像只能存13万条数据,更改ini配置 max_heap_table_size = ...

  4. 百万条数据插入mysql_mysql快速插入百万条数据

    作者:在赤道吃冰棍儿 www.jianshu.com/p/36b87cb3a05a 前言 假设现在我们要向mysql插入500万条数据,如何实现高效快速的插入进去?暂时不考虑数据的获取.网络I/O.以 ...

  5. python创建百万个文件_Python-实现对表插入百万条数据

    新手小白写的,我自己都不知道对不对,先写下来记着,以后掌握更多Python知识后,再来看下写的对不对. 题目:造一百万条大学生的基本信息(学校.专业.姓名.学号) 分析思路:利用Python的MySQ ...

  6. 低配MySQL数据库几十秒插入百万数据

  7. mysql中迅速插入百万条测试数据的方法

    2019独角兽企业重金招聘Python工程师标准>>> BEGIN#Routine body goes here...declare i decimal (10) default 0 ...

  8. mysql命令行批量添加数据_mysql命令行批量插入100条数据命令

    先介绍一个关键字的使用: delimiter 定好结束符为"$$",(定义的时候需要加上一个空格) 然后最后又定义为";", MYSQL的默认结束符为" ...

  9. 如何给mysql表添加百万条数据_给mysql一百万条数据的表添加索引

    直接alter table add index 添加索引,执行一个小时没反应,并且会导致锁表:故放弃该办法,最终解决办法如下: 一.打开mysql 命令行客户端 这里我们那可以看到导出的数据文件所存放 ...

最新文章

  1. js异步提交form表单的解决方案
  2. 优点 spark_spark(一)
  3. uvalive5986(贪心)
  4. Java文件上传如何实现呢?
  5. tortoisegit图标消失_TortoiseGit文件夹和文件图标不显示解决方法
  6. 萌龙大乱斗 合成表 持续更新
  7. 怎么查电脑系统版本_查中考分数线小程序功能更新,填志愿必备参考
  8. Spring IOC学习心得之源码级分析ContextLoaderListener的作用(IOC容器初始化入口)
  9. 将ERF格式转换成PCAP格式
  10. 实参和形参的一些问题
  11. php中魔术方法总结
  12. 倾心家教安卓案例开发代码_你或许从未听过的20个安卓开发工具
  13. php多图片打包下载
  14. 御剑+php,ps创意制作一个御剑飞行效果教程
  15. android抢qq红包源码,QQ抢红包插件实现
  16. 全集成隔离DC-DC转换器CA-IS3105W简介
  17. scrapy框架—spiders
  18. 【持续更新】 2022年 (2023届) 计算机 软件 保研经历 保研经验贴 (菜鸟 211 低rank 无科研成果 复旦/浙大/西安交大/中山/武大/华师大/东南/国科大杭高院)
  19. 关于解决Android studio:The emulator process for AVD Pixel_4_XL_API_30 has terminated 以及改变AVD存放位置
  20. uCOS-II之邮箱

热门文章

  1. 【邮箱验证码模板】java 整合redis 发送邮箱验证码模板
  2. 学习笔记 - CFA 权益
  3. 【统计学 第六周】抽样分布
  4. Android开发知识(一)(理论篇)
  5. Unity 持久化存储以及实时数据保存
  6. 操作系统实验(进程调度)
  7. 到2021年1月1日的天数(包括当天)
  8. 原创的20个Python自动化案例,一口一个,高效办公!
  9. 微信朋友圈图片查看器的实现
  10. 控制结构(强化):17.莫比乌斯函数