聊下多线程查询数据库
不啰嗦了,直接上代码
查询
/**** @param totalMap 返回结果* @param records 总条数* @param length 多线程请求条数* @param params 参数*/public void batchQuery(Map<Integer, List<UserExportDto>> totalMap,int records, int length, Map<String, Object> params) throws InterruptedException {if(records>length){//开启多线程查询int pageTotal = records/length + 1;CountDownLatch latch = new CountDownLatch(pageTotal);for (int i = 1; i <= pageTotal; i++) {int finalI = i;exportThreadPool.execute(()->{try{//查询数据库逻辑List<UserExportDto> list = xxxx;totalMap.put(finalI,list);}catch (Exception e){logger.info("多线程导出失败");totalMap.put(finalI,null);}finally {latch.countDown();}});}latch.await();}else{//查询数据库逻辑List<UserExportDto> list = xxxx;totalMap.put(1,list);}}
校验多线程是否完全成功
/*** 检测是否存在失败数据* @param totalMap* @return*/private boolean checkErrorData(Map<Integer, List<UserExportDto>> totalMap) {boolean successFlag = true;for (Integer i : totalMap.keySet()) {if(totalMap.get(i) == null){successFlag = false;break;}}return successFlag;}
主方法
private static final Logger logger = LoggerFactory.getLogger(ExportService.class);@Autowired@Qualifier("exportThreadPool")private TaskExecutor exportThreadPool;public void query(Map<String, Object> params) throws InterruptedException {//查询总条数int records = xxx;Map<Integer, List<UserExportDto>> totalMap = new HashMap<>();int length = 8000;if(records>0){batchQuery(totalMap,records,length,params);}else{//其他逻辑totalMap.put(1,new LinkedList<>());}//检测是否存在失败数据boolean successFlag = checkErrorData(totalMap);}
主方法上面的引用包
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
这里涉及到了一个自定义线程池
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
public class ExportThreadPoolConfig {@Bean("exportThreadPool")public TaskExecutor exportThreadPool() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//核心线程数executor.setCorePoolSize(5);//最大线程数executor.setMaxPoolSize(10);//等待队列executor.setQueueCapacity(200);//线程名前缀executor.setThreadNamePrefix("export-thread-");executor.initialize();return executor;}
}