虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢。10分钟内基本能看到结果。

之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据。

线程池数据插入核心代码:

ExecutorService executorService = Executors.newFixedThreadPool();
executorService.submit(new Runnable() {
@Override
public void run() {
for (int i = ; i < ; i++) {
TestUser user = new TestUser();
user.setName(RandomUtil.randomString());
userDao.insert(user);
System.out.println("插入数据:" + i);
} System.out.println(Thread.currentThread().getName() + "正在执行任务"); }
});

应用场景:
造测试数据,如千万甚至亿万级别的数据自动快速生成。

关键核心实现类代码如下:

long startTime = System.currentTimeMillis();
try { for (int i = ; i < ; i++) {
List<TestUser> users = new ArrayList<>(); for (int j = ; j < ; j++) {
TestUser user = new TestUser();
user.setName(RandomUtil.randomString());
user.setName2(RandomUtil.randomString());
user.setName3(RandomUtil.randomString());
user.setName4(RandomUtil.randomString());
user.setName5(RandomUtil.randomString());
user.setName6(RandomUtil.randomString());
user.setName7(RandomUtil.randomString());
user.setName8(RandomUtil.randomString());
user.setName10(RandomUtil.randomString());
user.setName11(RandomUtil.randomString());
user.setName12(RandomUtil.randomString());
user.setName13(RandomUtil.randomString());
user.setName14(RandomUtil.randomString());
user.setName15(RandomUtil.randomString());
user.setName16(RandomUtil.randomString());
user.setName17(RandomUtil.randomString());
user.setName18(RandomUtil.randomString());
user.setName19(RandomUtil.randomString());
user.setName20(RandomUtil.randomString()); users.add(user);
} int changed = userDao.batchAdd(users); System.out.println("#" + i + " changed=" + changed); }
} catch (Exception ex) {
ex.printStackTrace();
} finally {
long endTime = System.currentTimeMillis();
System.out.println("Time elapsed:" + toDhmsStyle((endTime - startTime) / ) + ".");
}

代码原理:
插入一千条数据后提交一次,然后重复一万次的方式。

关键核心DAO:

@Repository
public interface TestUserDao extends BaseMapper<TestUser> { int batchAdd(@Param("users") List<TestUser> users);
}

XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springcloud.blog.practice.dao.TestUserDao"> <insert id="batchAdd">
insert into test_user(name,name2,name3,name4,name5,name6,name7,name8,name9,name10,name11,name12,name13,name14,name15,name16,name17,name18,name19,name20)
values
<foreach collection="users" item="item" separator=",">
(#{item.name},#{item.name2},#{item.name3},#{item.name4},#{item.name5},#{item.name6},#{item.name7},#{item.name8},#{item.name9},#{item.name10},#{item.name11},#{item.name12},#{item.name13},#{item.name14},#{item.name15},#{item.name16},#{item.name17},#{item.name18},#{item.name19},#{item.name20})
</foreach>
</insert>
</mapper>

参考链接:
[MyBatis]五分钟向MySql数据库插入一千万条数据 批量插入 用时5分左右

java之5分钟插入千万条数据的更多相关文章

  1. 【JDBC】使用Spring提供的JDBCTemplate通过Statement向MySql数据库插入千万条数据,耗时4m55s,使用insert语句批量插入方式二

    这回依然是使用 insert批量插入这种方式 insert into emp(name,age,cdate) values ('A' , 20, '2019-10-13 00:00:00'), ('B ...

  2. python连接mysql循环插入千万条数据脚本

    之前都是在mysql的存储过程中插入数据,毕竟mysql语法函数有限,很多都有限制.突然想到学了python正好可以练练手.首先需要安装pymysql模块包(模块包安装请自行百度) pip insta ...

  3. 【JDBC】使用Spring提供的JDBCTemplate通过PrepareStatement向MySql数据库插入千万条数据,耗时32m47s,速度提升有限

    数据库环境还和原来一样,只是从Statement换成了PrepareStatement,都说PrepareStatement因为预编译比Statement快,但是实际运行真快不了多少. 代码如下: p ...

  4. [MyBatis]五分钟向MySql数据库插入一千万条数据 批量插入 用时5分左右

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 我的数据库环境是mys ...

  5. orcle 如何快速插入百万千万条数据

    有时候做实验测试数据用到大量数据时可以用以下方法插入: 方法一:使用xmltable create table bqh8 as select rownum as id from xmltable('1 ...

  6. java向数据库插入N条数据

    为了测试mysql的索引,要向数据库先插入上万条数据,然后再测试.手动插入太麻烦,写了一段代码. 先上代码: package action; import java.sql.Connection; i ...

  7. mysql自定义函数并在存储过程中调用,生成一千万条数据

    mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...

  8. 你向 Mysql 数据库插入 100w 条数据用了多久?

    阅读本文大概需要 2 分钟. ▌目录 多线程插入(单表) 多线程插入(多表) 预处理 SQL 多值插入 SQL 事务( N 条提交一次) ▌多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程 ...

  9. LOAD DATA INFILE读取CSV中一千万条数据至mysql

    作业要求 构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万 ...

随机推荐

  1. ElasticSearch 7.8.1 从入门到精通

    学前导读 ElasticSearch对电脑配置要求较高,内存至少4G以上,空闲2G内存,线程数4018+ 学习的时候,推荐将ElasticSearch安装到Linux或者mac上,极度不推荐装Wind ...

  2. CSS学习第三天

    定位布局: 相对定位:相对于自身的位置进行偏移position需要搭配left right top bottom      position: relative; 绝对定位:相对于有position属 ...

  3. C#LeetCode刷题之#520-检测大写字母(Detect Capital)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3947 访问. 给定一个单词,你需要判断单词的大写使用是否正确. ...

  4. (Filter + Listener )Day18

    Filter过滤器 filter是对客户端访问资源的过滤,符合条件的放行,不符合的不放行,并且可以对目标资源访问前后进行逻辑处理. 设置步骤 创建类实现Filter接口 在 doFilter 方法中编 ...

  5. 学长小清新题表之UOJ 180.实验室外的攻防战

    学长小清新题表之UOJ 180.实验室外的攻防战 题目描述 时针指向午夜十二点,约定的日子--\(2\)月\(28\)日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks ...

  6. 如何限制ip访问Oracle数据库

    一.概述 本文将给大家介绍如何限制某个ip或某个ip段才能访问Oracle数据库 通过sqlnet.ora 通过/etc/hosts.deny和/etc/hosts.allow 通过iptables ...

  7. Android 使用Zxing报错:Channel is unrecoverably broken and will be disposed!

    使用Zxing的扫描二维码库,修改成从相册识别二维码图片,根据网上的demo修改,继而在我使用的fragment报错Channel is unrecoverably broken and will b ...

  8. Java中实现十进制数转换为二进制的三种方法

    第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒着依次排列,就构成了转换后的二进制数 ...

  9. oracle进行一对多关联查询的时候,获取副表(也就是多条记录的那张表)的最新一条记录进行关联,如何获取多条记录最新一条呢?

    例如以下场景: 一条新闻对应多条审核记录,用户想知道这条新闻走到哪一步审核了. 使用:select * from (select b.*,(ROW_NUMBER() OVER (PARTITION B ...

  10. Mybatis入门(二)------增删改查

    Mybatis增删改查基本操作 一.XML实现方式 1.mapper.xml的配置 <?xml version="1.0" encoding="UTF-8" ...