引言:这几天工作这边同事遇到了一个问题,对十五万条数据进行计算,插入数据库的时候耗时很严重,使用了批量插入对十五万条数据插入仍然耗费了30秒,前面计算也耗费了二十多秒,系统流畅度因此很难堪。经过我的排查发现主要是两个点需要优化。

1)计算的算法冗余,优化前23秒计算完成,优化后0.8秒完成计算(由于业务特殊、保密不方便透露)

2)十五万条数据批量插入数据库时耗费了30秒,优化后3秒。(已达到业务要求范围内,所以不再继续其他细节优化)

批量插入基于的是mybatisplus 的service的insertBatch方法

优化思路:

使用线程池+任务分派器将15万条数据平均分派给线程池中16个线程去处理

存储所有数据的集合为list

线程池使用的FixedThreadPool,因为机器是四核8线程,所以我线程池里放的16个线程。

1、创建线程池

ExecutorService es = Executors.newFixedThreadPool(16);

2、任务分派器

其实就是一个函数,负责分派要插入的数据集合,遍历0到(线程数-1),然后将集合中所有数据平均分配到每一个线程(数据数量%线程数=余数,余下的几个数据的插入工作直接分配给最后一个线程去)

经过分配后每个线程负责1万条数据的插入

16个线程同时跑,由原来的30秒跑完,变成了3秒钟。

如果还需要优化,可以在线程内将自己受到的1万条数据,分10次批量插入或者每1000条批量插入一次