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

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

方法一:

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. 构建器Constructor的返回值/构建器

    构建器Constructor的返回值? 为什么会有这个问题? 在<Thinking in Java>中文Quanke翻译版本第四章初始化和清除,原书第五章Initialization&am ...

  2. tensorflow学习之(八)使用dropout解决overfitting(过拟合)问题

    #使用dropout解决overfitting(过拟合)问题 #如果有dropout,在feed_dict的参数中一定要加入dropout的值 import tensorflow as tf from ...

  3. final,finally,finalize

    final:可以修饰属性,可以修饰方法(方法不能被重写,可以继承),可以修饰类(该类不能被继承,不能产生子类) finally:无论什么情况,都会执行 finalize:垃圾回收时,调用此方法

  4. js 控制光标到指定位置

    js控制光标到指定节点位置(适用于富文本编辑器中) function placeCaretAtEnd(el) { //传入光标要去的jq节点对象 el.focus(); if (typeof wind ...

  5. C++程序调用python3

    今天想做一个简单的管理密码的小程序,由于最近了解了下Python,就想用Python来写.但是看了看Python的界面库用法有感觉有点麻烦,所以还不如直接使用MFC写写界面,关于csv的文件处理部分使 ...

  6. mac os ssh远程链接centos提示证书错误解决方法

    下面是错误提示 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you ...

  7. 深入理解java虚拟机(一)-----java内存区域以及内存溢出异常

    概述 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,J ...

  8. s6-3 通信模型

    传输层的作用范围 通信5元组 一些已分配的知名端口 三元组 协议. 本地端点. 远方端点 五元组 协议. 本地IP地址.本地端口号. 远端IP地址.远端端口号 通信5元组 源IP 源端口 目的I ...

  9. 再探haproxy

    一 设置haproxy输出log 1.1 调整配置文件 默认haproxy是不会输出log到文件的,这样很大程度在查询问题时会很不方便,haproxy是可以输出日志到文件的,配置文档类似于如下: ]# ...

  10. 用pyspider爬取并解析json字符串

    获取堆糖网站所有用户的id 昵称及主页地址 #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2016-06-21 13:57: ...