线程池实战-解析csv500w数据-笔记

提示:工作中的线程实战


个人笔记

前言

提示:实战背景:解析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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值