多线程之批量插入小demo
多线程之批量插入
背景
昨天在测试mysql的两种批量更新时,由于需要入库大量测试数据,反复执行插入脚本,过程繁琐,档次很低,测试完后我就想着写个批量插入的小demo,然后又想写个多线程的批量插入的demo,然后就有了下面的东西了……
环境
spring-boot 1.5.6 集成 mysql druid mybits 还有一些无关紧要的东西
代码
线程类:
/**
* @ClassName InsertDataThread
* @Description <插入数据类>
* @Author zhaiyt
* @Date 2018/8/29 17:04
* @Version 1.0
*/
public class InsertDataThread extends Thread { //日志
private final Logger logger = LoggerFactory.getLogger(InsertDataThread.class); //数据访问层
private UserEntityMapper userEntityMapper; //具体插入批次
private int batch; //插入的数据
private List<UserEntity> list; public InsertDataThread(UserEntityMapper userMpper, List<UserEntity> li, int batch) {
this.userEntityMapper = userMpper;
this.list = li;
this.batch = batch;
} @Override
public void run() {
try {
this.userEntityMapper.insertBatch(this.list);
logger.info("第" + this.batch + "批次插入成功");
} catch (Exception e) {
logger.error("第" + this.batch + "批次插入失败");
} }
}
===============================================================================
service层的多线程批量插入方法:
/**
* @param list
* @return int
* @Description <批量插入>
* @Author zhaiyt
* @Date 9:51 2018/8/29
* @Param [list]
*/
@Override
public int insertBatch(List<UserEntity> list) throws Exception {
PageHelper.offsetPage(0, 500000);
long start = System.currentTimeMillis();
List<UserEntity> listUser = userEntityMapper.selectAllUser();
int betch = 0;
if (CollectionUtils.isEmpty(listUser)) {
logger.error("表中无数据,需要改造测试");
return 0;
}
//根据数据量判断是否使用多线程 选择开启线程数
if (listUser.size() > 1000000) {
betch = 10;
} else if (listUser.size() > 100000) {
betch = 5;
} else if (listUser.size() > 10000) {
betch = 3;
} else {
//不走多线程
long end = System.currentTimeMillis();
logger.error("查询耗时:" + (end - start));
start = System.currentTimeMillis();
int count = userEntityMapper.insertBatch(listUser);
end = System.currentTimeMillis();
logger.error("插入耗时:" + (end - start));
return count;
} //计数器
int size = 0;
//创建线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(betch); for (int i = 0; i < (Math.ceil(listUser.size() / 5000)); i++) {
int startLen = i * 5000;
int endLen = ((i + 1) * 5000 > listUser.size() ? listUser.size() - 1 : (i + 1) * 5000);
// 该线程处理
List<UserEntity> threadList = listUser.subList(startLen, endLen);
size = size + threadList.size();
fixedThreadPool.execute(new InsertDataThread(userEntityMapper, threadList, i));
}
System.err.println("插入数据总条数:" + size);
long end = System.currentTimeMillis();
logger.error("查询耗时:" + (end - start));
return size;
}
项目路径:https://git.lug.ustc.edu.cn/zhaiyt/threadInsertDemo
多线程之批量插入小demo的更多相关文章
- Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- c#批量插入数据库Demo
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- C#中使用SqlBulkCopy的批量插入和OracleBulkCopy的批量插入
1.首先我们做一下准备工作,在sql server和oracle分别建立一个Student表 oracle中 --创建Student表 -- create table Student( stuId n ...
- Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)
Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer Advanced Installer :Free for 30 da ...
- 多线程查询数据,将结果存入到redis中,最后批量从redis中取数据批量插入数据库中【我】
多线程查询数据,将结果存入到redis中,最后批量从redis中取数据批量插入数据库中 package com.xxx.xx.reve.service; import java.util.ArrayL ...
- Mybatis 批量插入和更新小例
SpringBoot配置Mybatis前文有博文,数据库mysql: package com.example.demo.biz.dto; public class User { private int ...
- Python多线程Threading爬取图片,保存本地,openpyxl批量插入图片到Excel表中
之前用过openpyxl库保存数据到Excel文件写入不了,换用xlsxwriter 批量插入图片到Excel表中 1 import os 2 import requests 3 import re ...
- [小干货]SqlBulkCopy简单封装,让批量插入更方便
关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...
随机推荐
- SQLite在.NET中自适应32位/64位系统
如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不同了. SQLite的.NET开发包来自是System.D ...
- C# 枚举类型 enum
我个人感觉平日用到的enum应该是非常简单的,无非就是枚举和整数.字符串之间的转换.最近工作发现一些同事居然不太会用这个东东,于是就整理一下. 枚举类型是定义了一组“符号名称/值”配对.枚举类型是强类 ...
- js-工具函数
/** * 将文件大小转换成 ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],单位 * @param bytes * @returns */ ...
- 修改openssh显示版本号
问题描述: 漏洞安全对使用的软件扫描漏洞,都是依据软件的版本号探测的,直接升级软件风险太大,因此规避风险,修改软件版本号实现其目的! 问题解决: strings xxx |grep xxx //实 ...
- R语言之Random Forest随机森林
什么是随机森林? 随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法.随机森林的名称中有 ...
- Mac NVM 配置
1.NVM 简介 NVM(node version manager)是一个可以让你在同一台机器上安装和切换不同版本 node 的工具. GitHub 地址 2.NVM 环境配置 2.1 安装 NVM ...
- 微信小程序官方DEMO解读
我们在开始微信小程序开发的时候,对JS,HTML等前端知识一无所知,完完全全就是门外汉在尝试一个新的方向. 在下载好开发工具,微信就已经提供了一个DEMO例子: 从程序开发的角度来看这个陌生的目录结构 ...
- Atitit 创业好处 Atitit 为什么我们要创业
Atitit 创业好处 Atitit 为什么我们要创业 1.1. 提升学历 1 1.2. 提升自己的能力 1 1.3. 拓展视野 站在高层ceo 才能掌握全局.站在产业链高层,才可看到趋势. 1 1. ...
- 关于web项目创建后WEB-INF下面没有出现web.xml的解决方法
提供两种解决方案: 第一种:创建完项目后,需要手动创建出web.xml 第一步:选取创建的项目名称右击 第二步:eclipse的同学找到 java EE Tools 中的 下图画圈部分. MyEcl ...
- 猿题库从 Objective-C 到 Swift 的迁移
猿题库从 Objective-C 到 Swift 的迁移 引言 相信没有人会怀疑,Swift 是 iOS 开发未来的主流语言,但是由于 Swift 语言的不断变化以及庞大的迁移成本,真正把项目迁移到 ...