Mysql批量插入数据问题解决和优化

一、问题描述

项目中mysql批量插入大概50000左右数据,使用事务和批量,但是速度依旧很慢,大约60s左右,迫切希望改进这个问题。

二、问题原因

尽管是批量addBatch()但是,mysql却默认没有执行批量,时间还是一条一条添加导致速度非常慢。解决办法:链接mysql字符串添加 rewriteBatchedStatements=true

三、解决和验证

1.测试代码

(1)新建测试表语句

create table mysqltest(
id INT,
name char(10)
)create table mysqltest1(
id INT,
name char(10)
)

(2)Mysql链接工厂类

package bulk.mysql;
import java.sql.Connection;
import java.sql.DriverManager;public class MySQLConnections {private String driver = "";private String dbURL = "";private String user = "";private String password = "";private static MySQLConnections connection = null;private MySQLConnections() throws Exception {driver = "com.mysql.jdbc.Driver";dbURL = "jdbc:mysql://ip:3306/test?rewriteBatchedStatements=true";user = "root";password = "passwd";System.out.println("dbURL:" + dbURL);}public static Connection getConnection() {Connection conn = null;if (connection == null) {try {connection = new MySQLConnections();} catch (Exception e) {e.printStackTrace();return null;}}try {Class.forName(connection.driver);conn = DriverManager.getConnection(connection.dbURL,connection.user, connection.password);} catch (Exception e) {e.printStackTrace();}return conn;}
}

(3)Mysql更新类

package bulk.mysql;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class MySQLUpdate {static Connection con = MySQLConnections.getConnection();static PreparedStatement stmt = null;public static int executeInsert() throws SQLException {int i = 0;//设置批量处理的数量int batchSize = 5000;stmt = con.prepareStatement("insert into mysqltest (id,name) "+ "values (?,?)");// 关闭事务自动提交 ,这一行必须加上con.setAutoCommit(false);for (int j = 0; j < 50005; j++){++i;stmt.setInt(1, j);stmt.setString(2, "name");stmt.addBatch();if ( i % batchSize == 0 ) {stmt.executeBatch();con.commit();}}if ( i % batchSize != 0 ) {stmt.executeBatch();con.commit();}return i;}public static  void executeInsert2() throws SQLException {// 关闭事务自动提交 ,这一行必须加上con.setAutoCommit(false);stmt = con.prepareStatement("insert into mysqltest (id,name) "+ "values (?,?)");for (int j = 0; j < 50002; j++){stmt.setInt(1, j);stmt.setString(2, "name");stmt.addBatch();}stmt.executeBatch();con.commit();stmt.close();con.close();}}

(4)Mysql测试类

package bulk.mysql;import java.sql.SQLException;public class Test {public static void main(String[] args) throws SQLException {long begin1 = System.currentTimeMillis();MySQLUpdate.executeInsert();long end1 = System.currentTimeMillis();System.out.println("程序运行时间为:" + (end1 - begin1));long begin2 = System.currentTimeMillis();MySQLUpdate.executeInsert2();long end2 = System.currentTimeMillis();System.out.println("程序运行时间为:" + (end2 - begin2));}}

2.测试链接字符串不同配置

(1)为dbURL = “jdbc:mysql://ip:3306/test”;时

运行结果

程序测试插入时间
程序运行时间为:62095
程序运行时间为:60129

(2)为dbURL = “jdbc:mysql://ip:3306/test?rewriteBatchedStatements=true”;时

运行结果

程序运行时间为:2181
程序运行时间为:419

3.结论

优化了一百倍左右,这个真的很夸张了,而且确认最好一次性提交

4.注意JDBC批量操作的行数限制,如果stmt.executeBatch();执行过多而不提交,则会导致JDBC内存报错,建议60000条以内执行一次

四、参考

1.MySQL批量插入处理之提高速度

2. JDBC-批量操作的行数限制

3. execute(),executeQuery(),executeUpdate()和executeBatch()的使用与区别

Mysql批量插入数据问题解决和优化相关推荐

  1. MySQL 批量插入数据,单次插入多少条数据效率最高

    文章目录 一.前言 二.批量插入前准备 1.插入到数据表的字段 2.计算一行字段占用的空间 3.在数据里做插入操作的时候,整体时间的分配 三.批量插入数据测试 1.SQL语句的大小限制 2.查看服务器 ...

  2. MySQL 批量插入数据,一次插入多少行数据效率最高?

    一.前言 我们在操作大型数据表或者日志文件的时候经常会需要写入数据到数据库,那么最合适的方案就是数据库的批量插入.只是我们在执行批量操作的时候,一次插入多少数据才合适呢?假如需要插入的数据有百万条,那 ...

  3. MySQL批量插入数据的几种方法

    最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; ...

  4. MySQL(一) Python操控mysql批量插入数据

    在Python中,通过pymysql模块,编写简短的脚本,即方便快捷地控制MySQL数据库 一.连接数据库 使用的函数:pymysql.connect 语法:db=pymysql.connect(ho ...

  5. mysql批量插入数据的函数和存储过程

    -- 创建函数前,设置 set global log_bin_trust_function_creators=TRUE; -- 新建函数-产生随机的字符串 drop function if exist ...

  6. mysql 批量插入数据

    1.创建表 CREATE TABLE `user` (`id` int(50) NOT NULL,`username` varchar(255) DEFAULT NULL,`sex` varchar( ...

  7. python mysql批量insert数据_使用python往mysql批量插入数据时,报错not all arguments converted...

    我用这段命令可以往mysql数据库插入数据 insert into moderation_task(id, media_id, user_id, media_url_or_path, media_ti ...

  8. mysql 批量插入数据方法_mysql大批量插入数据的4种方法示例

    前言 本文主要给大家介绍了关于mysql大批量插入数据的4种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法一:循环插入 这个也是最普通的方式,如果数据量不是很大,可以使用, ...

  9. PHP向数据库循环插入数据,php实现向mysql批量插入数据

    现在有这样一个表,我们想往这个表里面插入大量数据该如何实现呢?CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_I ...

最新文章

  1. YYCache 源码分析(一)
  2. 列表框QListWidget类
  3. WP7开发—Silverlight多点触摸事件详解【含Demo代码】
  4. java 线程不运行时间_java如何设置线程运行时间吗
  5. 直接输入地址访问服务器上的静态资源
  6. [006] 了解 Roslyn 编译器
  7. AsyncSocket
  8. java集合类练习_JAVA集合类练习
  9. C++自学20:指针/指针的指针/const
  10. mysql中distinct
  11. 吴恩达神经网络和深度学习-学习笔记-34-LeNet-5 + Alexnet + VGG
  12. 妙用PRN文件,实现文档换机打印
  13. 论文总结:云安全研究方向及进展综述
  14. 纯css实现二级下拉菜单
  15. Springboot中下划线转驼峰配置
  16. EBS R12: 通过FND_PRODUCT_INSTALLATIONS中字段STATUS确认安装使用了哪些产品(或模块)
  17. proftpd mysql_ProFTPD支持MySQL添加虚拟用户认证及磁盘限额
  18. Spring boot JPA+Gradle+QueryDSL 完美配置生成Q文件依赖
  19. 如何做Unity手游性能优化的
  20. Python安装失败0x80070642错误解决方法

热门文章

  1. HttpMessageNotWritableException: No converter found for return value of type,可能出现的原因及解决方法
  2. word中给多个字符添加圆圈
  3. MDK5插件:代码格式整理、文件注释、函数注释
  4. js 获取与设置cookie
  5. 数控加工插补功能指令
  6. 世界各国人口相关指标(总人口、城镇/乡村人口及增长率、城镇化率、人口密度、男性/女性人口及增长率)1960-2021
  7. MySQL定时备份与清除脚本
  8. 视觉系统(CCD)光轴校正-项目实践
  9. 选择合适的java脚本语言
  10. 简单典型二阶系统_自动控制原理要点---第二章 系统建模