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

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

方法一:

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. Leetcode——Two Sum(easy)

    题目:Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1] 代码: ...

  2. 冒泡排序——JavaScript实现

    解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所 ...

  3. 【Selenium】【BugList11】启动selenium server报错:Unsupported major.minor version 52.0

    [环境信息] python:3.6.5 平台:win7 selenium:3.11.0 selenium server:selenium-server-standalone-3.11.0.jar jd ...

  4. 转载两篇dedecms的漏洞修复教程

    Dedecms安全步骤,安装之后的操作 1 将文件夹dede改名为其他,比如 /256256.com/ 2 搜索ad.dedecms.com,文件D:\WebSite\256256.com\www\g ...

  5. Python类——面向对象

    一.有关面向对象的一些知识 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” ...

  6. appium解决每次运行都需要安装Unlock以及AppiumSetting的问题

    这是我用appium遇到的第三个坑?之前因为环境的问题,chromedriver驱动总是安装不对,后来发现是因为路径的原因.解决之后,现在出现新的问题,那就是“appium每次运行都要去重新安装Unl ...

  7. function()

    avaScript中的function可以有以下两种用法:一是做“普通逻辑代码容器”,也就是我们通常意义上的函数.方法,和我们C/C++里的函数没什么大分别,只是写法稍有不同.用法更加灵活:二是做对象 ...

  8. C语言fprintf, fwrite, fscanf, fread混用问题

    int main(int argc, const char * argv[]) { // insert code here... FILE * fp = fopen("test.txt&qu ...

  9. Activiti工作流数据库表详细介绍

    Activiti的后台是有数据库的支持,所有的表都以ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的API对应. ACT_RE_*: 'RE'表示repository. 这个前缀 ...

  10. echarts 调整图表 位置 的方法

    ###内部图表大小是与div容器大小位置相关的,如果想调整图表大小位置,调整div的属性就可以了### ###如果是想调整图表与div间上下左右留白,则设置grid属性就可以了### 如图所示: 具体 ...