当前位置: 首页 > news >正文

聊下多线程查询数据库

不啰嗦了,直接上代码
查询

/**** @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;}
}
http://www.dtcms.com/a/307218.html

相关文章:

  • YOLO---01目标检测基础
  • C++从入门到起飞之——智能指针!
  • day 40 打卡-装饰器
  • Vulnhub Thales靶机复现详解
  • 02 基于sklearn的机械学习-KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)、决策树(信息增益、基尼指数)、随机森林
  • 【JEECG】JVxeTable表格拖拽排序功能
  • C语言:逆序输出0到9的数组元素
  • LeetCode Hot 100 搜索旋转排序数组
  • 腾讯云市场排名
  • 借助 Wisdom SSH 的 AI 助手构建 Linux 开发环境
  • 2419.按位与最大的最长子数组
  • duiLib 自定义资源目录
  • 限流算法详解:固定窗口、滑动窗口、令牌桶与漏桶算法全面对比
  • P1036 [NOIP 2002 普及组] 选数
  • 结合C++红黑树与AI人工智能的应用
  • Linux 系统日志管理与时钟同步实用指南
  • TCP和UDP编程的主要区别
  • 当人生低谷无人帮助时,如何独自奏响人生乐章
  • Linux系统编程Day1-- Linux系统的概念,主要内容
  • 查看遥控器6通道(以及其他通道)的实际PWM值
  • 洛谷 P1601 A+B Problem(高精)普及-
  • Datawhale AI夏令营 大模型技术task3 稍稍提分
  • 密码学安全性简介
  • LLM—— 基于 MCP 协议(Stdio 模式)的工具调用实践
  • 从一开始的网络攻防(十三):WAF入门到上手
  • 疏老师-python训练营-Day30模块和库的导入
  • Mysql事务基础
  • 通俗易懂的解释G1垃圾收集器
  • 学习Markdown
  • vulhub-Thales靶场攻略