最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别

别的先不说,先上一段代码与君共享

方法一:

package com.bigdata;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement; public class TestBigData { /**
* @param args
* @throws Exception
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws Exception {
//--------------------------------连接数据库----------------------
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://127.0.0.1:3306/test";
String user="root";
String password="root"; //1、新建驱动
Driver driverInstance = (Driver) Class.forName(driver).newInstance();
//2、注册驱动
DriverManager.registerDriver(driverInstance);
//3、获取连接
Connection conn = DriverManager.getConnection(url, user, password); //----------------------对数据库进行操作-------------------
//记录开始时间
Long begin=System.currentTimeMillis();
//-----------插入数据----------
//sql语句前缀
String sqlPre="insert into tb_big_db (count,create_time,random) values ";
StringBuffer sb = new StringBuffer();
//设置事务为非自动提交
conn.setAutoCommit(false);
//使用PrepareStatement更好
PreparedStatement pstate = conn.prepareStatement(""); //--------------------------十万条数据-------------
//设置外循环,总提交事务的次数
for(int i=0;i<100;i++){
for(int j=0;j<10000;j++){
//构建sql后缀
sb.append("("+j*i+",SYSDATE(),"+i*j*Math.random()+"),");
}
//构建完整的sql
String sql = sqlPre + sb.substring(0, sb.length()-1);
//添加sql
pstate.addBatch(sql);
//执行sql
pstate.executeBatch();
//提交事务
conn.commit();
//清空StringBuffer上一次添加的sql语句
sb = new StringBuffer();
}
//大循环完毕,关闭连接
pstate.close();
conn.close();
//结束时间
Long end = System.currentTimeMillis();
System.out.println("10万条数据,插入数据库耗时:"+(end-begin)+"ms");
} }

耗时:1952ms

说明:这速度,不堪入目啊,公司的数据库,不管从硬件还是软件来看,都不行呐。

方法二:

package com.bigdata;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement; public class TestBigData2 { public static void main(String[] args) throws Exception{
//--------------------------------连接数据库----------------------
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://127.0.0.1:3306/test";
String user="root";
String password="root"; //1、新建驱动
Driver driverInstance = (Driver) Class.forName(driver).newInstance();
//2、注册驱动
DriverManager.registerDriver(driverInstance);
//3、获取连接
Connection conn = DriverManager.getConnection(url, user, password); //-----------------------------------操作数据库-----------------
//记录开始时间
Long begin = System.currentTimeMillis(); //动态sql语句
String sql = "insert into tb_big_db (count,create_time,random) values (?,SYSDATE(),?)";
//设置事务为非自动提交
conn.setAutoCommit(false);
//预编译sql
PreparedStatement pstate = conn.prepareStatement(sql);
//外循环10次
for(int i=0;i<10;i++){
//内循环10000次
for(int j=0;i<1000;j++){
pstate.setLong(1, i*j);
pstate.setLong(2, i*j);
//添加到批处理上
pstate.addBatch();
}
//批处理
pstate.executeBatch();
//提交
conn.commit();
}
//关闭
pstate.close();
conn.close();
//结束时间
Long end = System.currentTimeMillis();
System.out.println("插入10万条数据,耗时:"+(end-begin)+"ms");
}
}

耗时:未知,原因是我用这个方法测试的时候,居然给我报内存溢出异常,说明这个方法需要的内存大,耗时高,所以我和上面的方法一做了个对比。

由于2个方法都用来prepareStatement类,该类在执行sql语句之前会对其进行预编译,就是说先把sql准备好先,用到的时候就直接用就可以了

方法一:通过代码分析,可以明显看到,方法一种的sql语句通过拼接成10条sql语句,故数据库执行语句时,只要执行10条就好

方法二:可以看出,它每循环一次,就要addBach()一次,速度变得更加慢,有10000条就addBatch()一万次,再批处理10次,所以速度变得慢是理所当然的

MySQL批量插入数据的几种方法的更多相关文章

  1. SQLServer 批量插入数据的两种方法

    SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...

  2. SQL 2005批量插入数据的二种方法

    SQL 2005批量插入数据的二种方法 Posted on 2010-07-22 18:13 moss_tan_jun 阅读(2635) 评论(2) 编辑 收藏 在SQL Server 中插入一条数据 ...

  3. MyBatis 批量插入数据的 3 种方法!

    批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...

  4. SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍 SQL Server支持的两种批 ...

  5. SQL Server 批量插入数据的两种方法(转)

    此文原创自CSDN TJVictor专栏:http://blog.csdn.net/tjvictor/archive/2009/07/18/4360030.aspx 在SQL Server 中插入一条 ...

  6. 转:SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...

  7. mysql 批量插入数据过多的解决方法

    使用场景: 测试时需要插入100w的数据,跑sql脚本插入非常慢. 存储过程如下: //DELIMITER DROP PROCEDURE if EXISTS createAmountCount; cr ...

  8. 小白鼠排队(map容器插入数据的四种方法)

    题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用“red”,“ ...

  9. python使用MySQLdb向mySQL批量插入数据的方法

    该功能通过调用mySQLdb python库中的 cursor.executemany()函数完成批量处理. 今天用这个函数完成了批量插入 例程: def test_insertDB(options) ...

随机推荐

  1. 小白的CTF学习之路5——内存的逻辑结构

    很衰的一天,各种意料之外的问题,但都挡不住我每日一更的步伐 内存的逻辑结构大致分为以下几种: 数组 栈与队列 链表 二叉树 以上,数组,栈,链表是我这章要说明的 在学习前需要了解的两个问题: 1.内存 ...

  2. PowerShell工作流学习-7-编写脚本工作流帮助

    关键点: a)工作流中不支持基于注释的帮助(标识工作流的帮助文件的 .ExternalHelp 注释除外). b)支持get-help参数的方式:使用 .ExternalHelp 注释以便 Get-H ...

  3. Redis Sentinel 配置文件

    基础参考:https://www.cnblogs.com/wang-li/p/9955303.html 配置文件讲解 1.sentinel monitor # sentinel monitor < ...

  4. openXML向Word插入表

    表是 Word 中的另一类型的块级内容,它是以行和列排列的一组段落(以及其他块级内容). Word 中的表格通过 tbl 元素定义,该元素类似于 HTML <表格>标记. 表元素指定文档中 ...

  5. github install

    1.安装git依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUti ...

  6. _ZNote_Qt_添加图标方法

    简单来说就两步: 将icns图标添加入资源文件,例如picture.icns .pro文件中添加 (图标) ICON = picture.icns 程序中添加(程序窗口上显示) setWindowIc ...

  7. Minimum setup for Apache+AD SSO

    参照: http://www.grolmsnet.de/kerbtut/ https://docs.typo3.org/typo3cms/extensions/ig_ldap_sso_auth/2.1 ...

  8. ICO图标下载地址

    http://findicons.com/ http://www.iconfont.cn/

  9. JavaScript复习笔记——数据类型

    1.undefined 使用var声明但未对其进行初始化时,这个变量的值就是undefined. 对未被初始化的值使用typeof会返回undefined值,而对未声明的变量执行typeof操作同样也 ...

  10. Python序列结构--元组

    元组:轻量级列表 元组创建于元素访问 >>> x = (1, 2, 3)>>> type(x)<class 'tuple'>>>> x ...