package com.yssh.service; import com.google.common.collect.Lists; import com.yssh.dao.VocValsMapper; import com.yssh.entity.VocCoords; import com.yssh.entity.VocVals; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; import java.util.concurrent.CountDownLatch; @Service public class VocValsService implements VocValsMapper { @Resource VocValsMapper vocValsMapper; protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public List selectByTime(String time) { return vocValsMapper.selectByTime(time); } @Override public int countByTime(String time) { return vocValsMapper.countByTime(time); } @Override public List selectCoords(Integer x, Integer y) { return vocValsMapper.selectCoords(x, y); } @Override public int insert(VocVals vv) { return vocValsMapper.insert(vv); } @Override public int inserts(List list) { return vocValsMapper.inserts(list); } @Override public int deleteLastYear() { return vocValsMapper.deleteLastYear(); } @Override public int deleteByTime(String time) { return vocValsMapper.deleteByTime(time); } @Async("threadPoolTaskExecutor") public void insertVocVals(List list) throws InterruptedException { List> lists = Lists.partition(list, IAsyncService.BATCH_INSERT_500); CountDownLatch countDownLatch = new CountDownLatch(list.size()); for (List corpList : lists) { executeAsync(corpList, countDownLatch); } countDownLatch.await(); logger.info("------ VOC.csv," + lists.size() + " 条数据已入库 ------"); } private void executeAsync(List corpList, CountDownLatch countDownLatch) { try { // 异步线程要做的事情 vocValsMapper.inserts(corpList); } finally { // 很关键, 无论上面程序是否异常必须执行countDown,否则await无法释放 countDownLatch.countDown(); } } }