线程池 plc 数据采集_线程池分批处理excel数据

一、场景

在开发excel处理数据时,因为数据库的卡顿,一次插入2000条数据速度可能需要1min左右,所以考虑使用线程池;每200个分组,有n组,就开(n+1)个线程去分批同时处理这些数据。

二、依赖

1. pom.xml

  cn.hutool hutool-all 4.5.10

2. excel的表格只有一个字段就是keyword,示例如下:

da6068667dd5176aa9d67be6e0264759.png

3. 数据库:t_keyword(只有一个字段keyword,并且加唯一索引)

三、代码

fbfbb72ca089884a6678a63028313076.png

dao.java

package com.bds.pool.ihg_fb;import org.nutz.dao.impl.NutDao;import org.nutz.dao.impl.SimpleDataSource;/** * @ClassName: Dao.java * @Description:  * @author : jack.Lu * @version : V1.0  * @Date : 2019年7月11日 下午5:08:13  */public class Dao {  public static NutDao getDao() { // 创建一个数据源 SimpleDataSource dataSource = new SimpleDataSource(); dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1/bds"); dataSource.setUsername("root"); dataSource.setPassword("root"); // 创建一个NutDao实例,在真实项目中, NutDao通常由ioc托管, 使用注入的方式获得. NutDao dao = new NutDao(dataSource); return dao; }}

dealExcel.java

package com.bds.pool.ihg_fb;import java.util.ArrayList;import java.util.List;import org.nutz.dao.impl.NutDao;/** * @ClassName: DealExcel.java * @Description:  * @author : jack.Lu * @version : V1.0  * @Date : 2019年7月11日 下午2:18:48  */public class DealExcel implements Runnable{  List list;  private String thread_name;  private Boolean success=false;  public DealExcel(String thread_name,List list) { this.thread_name = thread_name; this.list=list; }  public int deal() { List list_k = new ArrayList<>(); KeyWord k = new KeyWord(); NutDao dao = Dao.getDao(); for(String s : list) { k.setKeyword(s); try { dao.insert(k); } catch (Exception e) { System.out.println(s+">>>>>>>>>>>已经插入!"); } }  return list.size(); } @Override public void run() { System.out.println(this.thread_name+"***********"+Thread.currentThread().getName()+"开始处理...."); int deal = this.deal(); success = true; System.out.println(this.thread_name+"***********"+Thread.currentThread().getName()+"处理完成"+deal+"条数据"); } public Boolean getSuccess() { return success; } public String getThread_name() { return thread_name; }   }

KeyWord.java

package com.bds.pool.ihg_fb;import org.nutz.dao.entity.annotation.Column;import org.nutz.dao.entity.annotation.Table;/** * @ClassName: KeyWord.java * @Description:  * @author : jack.Lu * @version : V1.0  * @Date : 2019年7月11日 下午5:09:54  */@Table("t_keyword")public class KeyWord { @Column private String keyword; public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } }

PoolThread.java

package com.bds.pool.ihg_fb;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import cn.hutool.core.io.FileUtil;import cn.hutool.poi.excel.ExcelReader;import cn.hutool.poi.excel.ExcelUtil;/** * @ClassName: PoolThread.java * @Description: 开启线程池 * @author : jack.Lu * @version : V1.0  * @Date : 2019年7月11日 下午2:18:35  */public class PoolThread { /**   *程序的入口   */ public static void main(String args[])throws Exception{ readExcel(); }  /** * 1.读取excel * 2.对excel进行200分段 * 3.开启线程池 * @param args */ public static void readExcel(){ //1.读取excel ExcelReader excelReader = ExcelUtil.getReader(FileUtil.file("C:甥敳獲adminDesktop新建文件夹XHS 笔记需求 0709-03.xlsx")); List> read = excelReader.readAll(); PoolThread pl = new PoolThread(); List> excelByRead = pl.getExcelByRead(read);//500条数据,每200一条,共3组  //要开启的线程数//3组 int size = excelByRead.size(); ExecutorService pool = Executors.newFixedThreadPool(size+1); List task_list = new ArrayList(); for (int i = 0; i < size; i++) { List list = excelByRead.get(i); DealExcel dx = new DealExcel(i+"-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值