有20万的数据量,在插入数据库的时候使用多线程跑,还是慢,大概要花30分钟左右,而且越跑越慢,请问一下,如何优化,代码如下:
1、创建多线程
//创建多线程
public void exec(List<VSmCompany> list) throws InterruptedException {
int count = 500;
int listSize = list.size();
int runSize = (listSize / count) + 1; //开启的线程数
// List<VSmCompany> newList = null; //存放每个线程的执行数据
ExecutorService executor = Executors.newFixedThreadPool(runSize); //创建一个线程池,数量和开启线程的数量一样
CountDownLatch begin = new CountDownLatch(1); //计数器
CountDownLatch end = new CountDownLatch(runSize);
//循环创建线程
for (int i = 0; i < runSize; i++) {
//计算每个线程执行的数据
if ((i + 1) == runSize) {
int startIndex = (i * count);
int endIndex = list.size();
List<VSmCompany> newList = list.subList(startIndex,endIndex);
executor.execute(new MyThread(newList,begin,end));
} else {
int startIndex = (i * count);
int endIndex = (i + 1) * count;
List<VSmCompany> newList = list.subList(startIndex,endIndex);
executor.execute(new MyThread(newList,begin,end));
}
}
begin.countDown();
end.await();
//执行完关闭线程池
executor.shutdown();
}
2、业务逻辑
public class MyThread implements Runnable {
private static Logger logger = LoggerFactory.getLogger(MyThread.class);
private SmComJudgeTaskService smComJudgeTaskService;
private List<VSmCompany> list;
private CountDownLatch begin;
private CountDownLatch end;
public MyThread(List<VSmCompany> list, CountDownLatch begin, CountDownLatch end) {
this.list = list;
this.begin = begin;
this.end = end;
}
@Override
public void run() {
smComJudgeTaskService = SpringContextHolder.getApplicationContext().getBean(SmComJudgeTaskService.class);
try {
for (int i = 0; i < list.size(); i++) {
SmComJudgeTask judgeTask = new SmComJudgeTask();
judgeTask.setComId(list.get(i).getId());
judgeTask.setComName(list.get(i).getQymc());
judgeTask.setGpsAddress(list.get(i).getGpsAddr());
judgeTask.setGpsLatitude(list.get(i).getGpsLatitude());
judgeTask.setGpsLongitude(list.get(i).getGpsLongitude());
judgeTask.setProvinceCode(list.get(i).getProvience());
judgeTask.setCountyCode(list.get(i).getCounty());
judgeTask.setCityCode(list.get(i).getCity());
judgeTask.setCompanyType(list.get(i).getCompanyType());
judgeTask.setSocialCode(list.get(i).getXydm());
judgeTask.setLegalPerson(list.get(i).getFzr());
judgeTask.setLegalPersonPhone(list.get(i).getLxdh());
judgeTask.setAddress(list.get(i).getZs());
judgeTask.setTaskSource("1");
judgeTask.setTaskStatus("0");
judgeTask.setTaskIssueTime(new Date());
judgeTask.setSuperviseCategory("1");
judgeTask.setCompanyCategory("1");
judgeTask.setJudgeType("10");
smComJudgeTaskService.save(judgeTask);
}
}
那你多线程肯定没用对。不然不可能效率没变化。
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632