美文网首页
多线程批量数据入库

多线程批量数据入库

作者: 陈先森不喝酒 | 来源:发表于2019-08-28 13:57 被阅读0次

在一个项目中需要Excel批量导入数据,然后就写了一个测试程序。
这次测试的数据是九千条数据最快7秒左右可以全部入库,用的是Mysql数据库v5.6,Mybatis框架。我试验了下,不用多线程需要47秒。

用 Executor 创建线程池
@Configuration
@EnableAsync
public class ExecutorConfig {

    @Bean
    public Executor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(10);
        //配置最大线程数
        executor.setMaxPoolSize(10);
        //配置队列大小
        executor.setQueueCapacity(99999);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-remit-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        return executor;
    }
}
使用多线程插入数据库
@Async("asyncServiceExecutor")
    @Override
    public void staffIntoStore(String filePath,Long companyUuid) {
        ExcelHandle handle = new ExcelHandle();
        try {
            File file = new File(filePath);
            List<String> list = new ArrayList<>();
            list.add("name");
            list.add("idcard");
            // 从excel表中获取数据
            List<Map<String,Object>> data = handle.getListValue("D:\\test.xlsx",list,0,file);
            int dataSize = data.size();
            // 这个是记录插入数据的进度
            staffEnteringProcessCache.clearProgress(companyUuid);
            staffEnteringProcessCache.setTotal(companyUuid,dataSize);
            // 每次插入50条数据
            int step = 50;
            int totalTasks = (dataSize % step == 0 ? dataSize/step : (dataSize/step + 1));
            final CountDownLatch countDownLatch = new CountDownLatch(totalTasks);
            long startTime1 = System.currentTimeMillis();
            for(int j = 0; j < dataSize; j=j+step){
                final int start = j;
                final int perCount = (dataSize - start) < step ? (dataSize - start) : step;
                asyncServiceExecutor.execute(new Runnable() {
                    public void run() {
                        try {
                            System.out.println("多线程开始: start == " + start + " , 多线程个数count" + perCount);
                            int count = staffMapper.insertBatch(data.subList(start,perCount+start));
                            System.out.println(staffEnteringProcessCache.incre(companyUuid,count));
                            countDownLatch.countDown();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程池循环耗时=======" + (System.currentTimeMillis() - startTime1));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
打印日志.jpg

第一次写文章,写的不好的地方,多多见谅,觉得有点帮助,请多多点赞,谢谢 _

相关文章

  • 多线程批量数据入库

    在一个项目中需要Excel批量导入数据,然后就写了一个测试程序。这次测试的数据是九千条数据最快7秒左右可以全部入库...

  • mybatis 批量插入sqlserver BigDecimal

    现象:1:批量插入数据时,如果插入的数据精度不统一,最终入库的数据精度统一按最低的精度入库;2:单条插入无此问题;...

  • 多线程批量导入数据

    如何用多线程批量导入数据?最近的使用场景就是批量导入excel数据,数据量太大的话会导致超时、服务异常超时等问题。...

  • 利用spring实现多线程 + 事务回滚

    前言 利用线程池和CountDownLatch,多线程并发处理批量数据,实现多线程事务回滚,事务补偿。 begin...

  • Elasticsearch-BulkProcessor踩坑之源码

    1. 背景 在开发es入库组件时,使用BulkProcessor处理大批量的数据,遇到了数据入不进es。分析后发现...

  • SpringBoot+ThreadPoolTaskExecuto

    前言 开发目的: 提高百万级数据插入效率。 采取方案: 利用ThreadPoolTaskExecutor多线程批量...

  • SpringBoot+ThreadPoolTaskExecuto

    开发目的: 提高百万级数据插入效率。 采取方案: 利用ThreadPoolTaskExecutor多线程批量插入。...

  • python优雅实现批量数据入库

    1、如果与数据库交互比较频繁的话,建议使用数据库连接池,示例如下(使用的是python2.7): from psy...

  • SpringBoot利用ThreadPoolTaskExecut

    1 前言 开发目的:提高百万级数据插入效率。 采取方案:利用ThreadPoolTaskExecutor多线程批量...

  • Neo4j-开发备忘

    Neo4j version : 3.3.0 性能问题 批量CSV数据导入文件路径被篡改问题 提交csv文件加载入库...

网友评论

      本文标题:多线程批量数据入库

      本文链接:https://www.haomeiwen.com/subject/vlbpectx.html