提示:工作中的线程实战
个人笔记
前言
提示:实战背景:解析500万数据csv文件入库
注意:
这里面没有写事务,最好加上事务,防止中途代码报错,导致没有回滚,数据插入数据库。
一、解析csv文件配置类
package com.service.boot.config;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
public class StreamUtil {
// 批量关闭流
public static void closings(AutoCloseable... closeables) throws Exception {
// 非空判断
if (closeables != null) {
// 循环关闭
for (AutoCloseable auto : closeables) {
// 非空判断
if (auto != null) {
auto.close();
}
}
}
}
// 按行读取文本文件(返回List集合)
// 默认UTF-8格式
public static List<String> readingLineFormTextFile(File textFile) throws Exception {
return readingLineFormTextFile(textFile, "UTF-8");
}
// 自定义编码格式
public static List<String> readingLineFormTextFile(File textFile, String encode) throws Exception {
// 存放结果
List<String> list = new ArrayList<String>();
// 字符输入流
FileReader fr = new FileReader(textFile);
// 缓冲字符输入流
BufferedReader br = new BufferedReader(fr);
// 用于存入复制的数据
String str = null;
// 复制,如果读取的不为空,证明读取到了数据
while ((str = br.readLine()) != null) {
list.add(str);
}
// 关流
closings(br);
closings(fr);
return list;
}
}
二、实体类
package com.service.boot.entity;
import lombok.Builder;
import lombok.Data;
import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author
* @since 2022-04-06
*/
@Data
@Builder
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private Integer age;
private Integer sex;
private Date time;
}
三、线程池实现类
注意:把主要代码写到impl文件里面,保证安全性
@RequestMapping(method = RequestMethod.GET ,path = "insertss")
public Result insertss(){
int maxList=2000;
try {
// 解析csv文件
long l = System.currentTimeMillis();
List<String> strings = StreamUtil.readingLineFormTextFile(new File("D:\\word\\test.csv"));
long l1 = System.currentTimeMillis();
System.out.println("stream结束时间"+(l1-l)/1000+"秒");
// 存入list<Test>里面
List<Test> tests = new ArrayList<>();
for (int i = 1; i <strings.size() ; i++) {
if(tests.size()<5000000) {
Test build = Test.builder().name(strings.get(i).split(",")[1]).id(strings.get(i).split(",")[0]).build();
tests.add(build);
}
}
// 创建线程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 40, 1, TimeUnit.HOURS, new ArrayBlockingQueue<>(3),new ThreadPoolExecutor.CallerRunsPolicy());
for (int j = 0; j < tests.size(); ) {
int startIndex = j;
int index = j + maxList > tests.size() ? tests.size() : +j + maxList;
List<Test> tests1 = tests.subList(startIndex, j=index);
threadPoolExecutor.execute(()->{
testService.inseert222(tests1);
});
}
} catch (Exception e) {
e.printStackTrace();
}
return Result.success(1);
}
}
四、xml文件
<insert id="insert1" parameterType="list">
insert into test2 (id,name,age,sex,time) values
<foreach collection="list" item="item" separator=",">
(#{item.id},#{item.name},#{item.age},#{item.sex},#{item.time})
</foreach>
</insert>
五、数据库设计截图
六、数据库文件
可以加我qq要test.csv文件
qq:2649271820