java线程池实例(利用多线程将400万数据导入到Elasticsearch)

项目中需要用到ES,在写完接口后,对ES进行测试时,需要导入100万,400万,500万数据,分三次导入。在用java代码导入时,100万数据用时40分钟。后边还有两次400万和500万的数据导入。所以利用多线程提高导入效率。

我本地机器测试时,线程池的大小设为100时,性能最佳。

导入100万数据时单线程写法:

导入耗时:

 

2439796毫秒=2439.7秒=40.7分钟

 

下边是导入400万数据多线程写法:

class IntoESTask implements Runnable{
         private ElasticsearchTemplate elasticsearchTemplate;
         private int index;

        public IntoESTask(ElasticsearchTemplate elasticsearchTemplate, int index) {
            super();
            this.elasticsearchTemplate = elasticsearchTemplate;
            this.index = index;
        }

        @Override
        public void run() {
           
            News a = new News();
            a.setTitle("结构化数据性能测试");
            a.setTag("tag");
            a.setPublishTime("2020-02-24T13:34:00Z");
            try {
                elasticsearchTemplate.save(a);
            } catch (Exception e) {
                 e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"执行了第"+index+"任务");
        }
         
     }
     @Test
     public void testCustomSaveBigData() throws Exception{
         init2();
         StopWatch stopwatch = new StopWatch();
         stopwatch.start();
         ExecutorService pool = Executors.newFixedThreadPool(100);
         
         for (int i = 0; i < 4000000; i++) {
             
             pool.execute(new IntoESTask(elasticsearchTemplate, i));
         }
        
         pool.shutdown();
         
         while(!pool.isTerminated()){
             //等待所有任务完成
         }
         stopwatch.stop();
        System.out.println(stopwatch.getTime()/1000);
     
     }
     

利用多线程后,导入用时:

 

2933秒大约是48.9分钟。 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值