SpringBoot的并行SQL任务并完成所有任务之后返回操作
一、核心实现方案
1. 线程池配置与异步支持
通过 @EnableAsync 启用异步支持,并自定义线程池避免默认线程池的性能问题:
@Configuration
@EnableAsync
public class AsyncConfig {@Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5); // 根据业务负载调整executor.setMaxPoolSize(10); // 突发流量缓冲executor.setQueueCapacity(100); // 防止 OOMexecutor.setThreadNamePrefix("DB-Async-");executor.initialize();return executor;}
}
关键点:
• 线程池隔离避免资源竞争(如 IO 密集型与 CPU 密集型任务分开)
• 拒绝策略需根据业务场景定制(如日志记录或降级处理)
2. 服务层异步方法封装
通过 @Async 注解将数据库查询封装为异步任务:
@Service
public class AsyncQueryService {@Autowiredprivate UserRepository userRepo;@Asyncpublic CompletableFuture<List<User>> queryUsers() {return CompletableFuture.supplyAsync(userRepo::findAll);}@Asyncpublic CompletableFuture<List<Order>> queryOrders() {return CompletableFuture.supplyAsync(orderRepo::findAll);}
}
关键点:
• @Async 方法需定义在独立 @Service 类中(Spring 代理机制限制)
• 返回 CompletableFuture 以实现链式编排
3. 控制层任务编排与结果合并
使用 CompletableFuture.allOf() 实现任务同步等待,并通过 join() 提取结果:
@RestController
public class DataController {@Autowiredprivate AsyncQueryService asyncService;@GetMapping("/parallel-query")public ResponseEntity<Map<String, Object>> parallelQuery() {CompletableFuture<List<User>> usersFuture = asyncService.queryUsers();CompletableFuture<List<Order>> ordersFuture = asyncService.queryOrders();CompletableFuture.allOf(usersFuture, ordersFuture).join(); // 阻塞等待Map<String, Object> result = new HashMap<>();result.put("users", usersFuture.join());result.put("orders", ordersFuture.join());return ResponseEntity.ok(result);}
}
关键点:
• allOf().join() 会阻塞主线程直至所有任务完成
• 生产环境需添加超时控制(如 orTimeout(5, SECONDS))
二、高级优化策略
1. 动态数据源管理
若查询涉及多个数据库(如 MySQL 和 SQL Server),需配置多数据源:
# application.yml
spring:datasource:dynamic:primary: mysqldatasource:mysql:url: jdbc:mysql://localhost:3306/db1sqlserver:url: jdbc:sqlserver://localhost:1433;databaseName=db2
结合 ThreadLocal 和 AbstractRoutingDataSource 实现动态切换:
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSource(); // 从ThreadLocal获取数据源标识}
}
2. 结果合并与链式编程
使用 thenCombine() 优化结果合并逻辑:
CompletableFuture<CombinedResult> combinedFuture = usersFuture.thenCombine(ordersFuture, (users, orders) -> new CombinedResult(users, orders));
优势:
• 避免嵌套回调,提升代码可读性
• 支持异常传递与统一处理
3. 事务与一致性保障
在异步任务中管理事务需注意:
• 默认 @Async 方法不在事务上下文中执行,需显式配置 @Transactional
• 多数据源场景需为每个数据源单独配置事务管理器
三、性能与异常处理
1. 线程池监控
通过 ThreadPoolTaskExecutor 方法监控:
int activeCount = executor.getActiveCount(); // 活跃线程数
int queueSize = executor.getQueue().size(); // 队列堆积情况
2. 异常兜底策略
usersFuture.exceptionally(ex -> {log.error("用户查询失败", ex);return Collections.emptyList(); // 返回降级结果
});
四、适用场景对比
| 方案 | 适用场景 | 优点 | 限制 |
|---|---|---|---|
@Async + CompletableFuture | 简单查询并行化 | 代码简洁,Spring 原生支持 | 事务管理复杂 |
ExecutorService | 需精细控制线程池或非 Spring 环境 | 灵活性高 | 需手动管理生命周期 |
| JDBC 异步 API | 低延迟、高吞吐场景 | 无框架依赖 | 需数据库驱动支持 |
通过上述方案,原本串行的多个数据库查询可并行执行,总耗时由最慢的查询决定,而非各查询耗时的累加。实际应用中需根据数据量、数据库负载和业务一致性要求选择合适的实现方式。
相关文章:
SpringBoot的并行SQL任务并完成所有任务之后返回操作
一、核心实现方案 1. 线程池配置与异步支持 通过 EnableAsync 启用异步支持,并自定义线程池避免默认线程池的性能问题: Configuration EnableAsync public class AsyncConfig {Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor …...
《AI浪潮中的璀璨新星:Meta Llama、Ollama与DeepSeek的深度剖析》:此文为AI自动生成
《AI浪潮中的璀璨新星:Meta Llama、Ollama与DeepSeek的深度剖析》:此文为AI自动生成 引言:AI 大模型的群雄逐鹿时代 在科技飞速发展的当下,AI 大模型领域已成为全球瞩目的焦点,竞争激烈程度堪称白热化。从 OpenAI 推出…...
LVGL移植到6818开发板
一、移植步骤 1.lv_config.h 配置文件启动 framebuffer 2、lv_config.h 配置文件关闭SDL 2.修改main.c 去掉SDL输入设备 3.修改Makefile 文件启动交叉编译 去掉警告参数 去掉SDL库 4.交叉编译代码 make clean #清空 ⭐ 必须要清空一次再编译! 因为修改了 lv_con…...
Spring Boot应用首次请求性能优化实战:从数据库连接池到JVM调优
目录 问题现象与背景分析性能瓶颈定位方法论数据库连接池深度优化Spring Bean生命周期调优JVM层性能预热策略全链路监控体系建设生产环境验证方案总结与扩展思考1. 问题现象与背景分析 1.1 典型问题场景 在某互联网金融项目的Spring Boot应用上线后,运维团队发现一个关键现象…...
UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法
有些差异 这么牛逼的引擎,居然有这种入门级别的问题,一触发清理,大概率(80%)会崩溃 无论虚幻5还是UE4都有这个问题,挺烦人的 实在忍不了了,这次,今天 就想问问有什么好的处理方法么?&#x…...
(全)2024下半年真题 系统架构设计师 综合知识 答案解析01
系统架构设计师第二版教程VIP课程https://edu.csdn.net/course/detail/40283 操作系统 下列选项中不能作为预防死锁措施的是 。 A. 破坏“循环等待"条件 B. 破坏“不可抢占”条件 C. 破坏“互斥”条件 D. 破坏“请求和保持”条件 答案:C 解析&…...
程序化广告行业(18/89):交易模式与关键概念解析
程序化广告行业(18/89):交易模式与关键概念解析 大家好呀!一直以来,我都在深入研究程序化广告这个充满挑战与机遇的领域,在学习过程中收获了很多,也迫不及待想和大家分享。写这篇博客ÿ…...
Linux系统之less命令的基本使用
Linux系统之less命令的基本使用 一、less命令介绍二、less命令的使用帮助2.1 less命令的帮助信息2.2 less命令主要选项解释 三、less命令的基本使用3.1 查看文件内容3.2 结合管道使用 四、注意事项 一、less命令介绍 在Linux和Unix类操作系统中,文件浏览是一项常见的…...
【微知】plantuml在泳道图中如何将多个泳道框起来分组并且设置颜色?(box “浏览器“ #LightGreen endbox)
泳道分组并且着色 分组用 box和endbox ,颜色用#xxx,标注用"xxx" box "浏览器" #LightGreen participant "浏览器1" as Browser participant "浏览器2" as Browser2 endboxparticipant "服务端" as …...
C#生产型企业ERP系统管理软件PCB行业ERP进销存MRP管理系统BOM管理
背景 本软件为为苏州某生产型电子科技企业开发的ERP管理软件。 功能说明 希哲管理系统v1.0是一款在流览器上使用的企业管理软件,使用上与客户端版的优势是: 1.安装更新部署方便,只需服务器部署了软件,其它客户端的用户无需安装&am…...
文件系统 linux ─── 第19课
前面博客讲解的是内存级文件管理,接下来介绍磁盘级文件管理 文件系统分为两部分 内存级文件系统 : OS加载进程 ,进程打开文件, OS为文件创建struct file 和文件描述符表 ,将进程与打开的文件相连, struct file 内还函数有指针表, 屏蔽了底层操作的差异,struct file中还有内核级…...
基于大模型预测的难治性青光眼诊疗方案研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测难治性青光眼的原理与方法 2.1 大模型介绍 2.2 数据收集与预处理 2.3 模型训练与优化 三、术前风险预测与准备 3.1 术前眼压及视神经损伤风险预测 3.2 患者全身状况评估 3.3 术前准备工作 四…...
射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用
射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用 一、FEM是什么? 射频前端模块(Front-End Module, FEM)是无线通信系统中负责处理射频信号的核心组件。它将多个关键电路集成在一个模块中,包括功率放大器(PA)、低噪声放大器(LNA)、射频开关(Switch)、…...
qemu分析之 KVM_EXIT_MMIO
基于qemu-2.8.1 address_space_rw 函数作用 这是QEMU内存子系统的核心函数,负责分块处理跨MemoryRegion的内存读取操作。主要场景包括: 处理跨越多个MemoryRegion的连续内存读取区分RAM直接访问与MMIO设备模拟处理不同位宽(1/2/4/8字节&am…...
k8s系统学习路径
学习 Kubernetes(K8s)需要循序渐进,结合理论知识和实践操作。以下是学习 Kubernetes 的推荐步骤: 1. 先决条件 • 掌握容器基础:先学习 Docker,理解容器化概念(镜像、容器、仓库)、…...
OSI 七层网络模型
文章目录 OSI 七层模型应用层表示层会话层传输层网络层数据链路层物理层 TCP/IP 四层模型应用层传输层网络层数据链路层 TCP/IP 特点OSI 和 TCP/IP 两者关系通信过程及相关协议常用协议及端口号常用协议分类参考链接 OSI 七层模型 七层模型,亦称OSI(Ope…...
虚拟电商-数据库分库分表(二)
本文章介绍:使用Sharding-JDBC实现数据库分库分表,数据库分片策略,实现数据库按月分表 一、Sharding-JDBC使用 1.1.准备环境 步骤一:分库分表sql脚本导入 创建了两个数据库:chongba_schedule0 和chongba_schedule1…...
进程间通信--匿名管道
进程间通信介绍 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件&…...
人工智能治理的两会声音:技术规范与伦理风险探讨
摘要 在最近的两会期间,科技界代表聚焦人工智能(AI)治理问题,提出多项建议。这些建议涵盖AI技术规范、伦理风险预防与控制等方面。代表们强调建立健全法律法规和技术标准体系,确保AI健康发展。同时,重视公众…...
C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色
C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色 安装 Install-Package OpenCvSharp4 Install-Package OpenCvSharp4.Windows 普通实现 using System; using System.Collections.Generic; using System.Linq; using OpenCvSharp; // 添加OpenCV引用…...
基于SSM + JSP 的图书商城系统
基于SSM的图书商城 网上书城、图书销售系统、图书销售平台 |Java|SSM|HTML|JSP| 项目采用技术: ①:开发环境:IDEA、JDK1.8、Maven、Tomcat ②:技术栈:Java、…...
Powershell如何查询 windows defender是否开启
可以通过PowerShell使用以下方法检查Windows Defender(Microsoft Defender Antivirus)的状态: 方法1:使用 Get-MpComputerStatus 命令 此命令会返回Microsoft Defender的全面状态,包括实时保护、病毒定义版本等&#…...
【漫话机器学习系列】133.决定系数(R²:Coefficient of Determination)
决定系数()详解 决定系数()是回归分析中用于评估模型拟合优度的一个重要统计指标。它表示自变量(特征变量)能够解释因变量(目标变量)变异的程度,取值范围为 [0,1] 或 (−…...
【MySQL】数据库简要介绍和简单应用
目录 数据库简要介绍 SQL 的简单应用 需要注意的: 数据库简要介绍 数据库(database)是指长期存储在计算机内,有组织的、可共享的数据集合。它可视为一个电子化的文件柜,用来存储电子文件,用户可以对文件中的数据进行査询、新增、更新、删…...
【Kubernets】Deployment 和 StatefulSet 有什么区别?什么时候用 StatefulSet?
Deployment 和 StatefulSet 的区别 在 Kubernetes 中,Deployment 和 StatefulSet 都用于管理 Pod,但它们适用于不同的场景。 1. Deployment:管理无状态应用 特点: 无状态:Pod 之间相互独立,不需要保持顺…...
Machine Learning: 十大基本机器学习算法
机器学习算法分类:监督学习、无监督学习、强化学习 基本的机器学习算法: 线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强。 机器学习算法大致可以分为三类: 监督学习算法 (Sup…...
洛谷 P2801 教主的魔法 题解
之前学过 莫队 算法,其运用了分块思想;但是我居然是第一次写纯种的分块题目。 题意 给你一个长度为 n n n 的序列 a a a(一开始 ∀ a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ∀ai∈[1,1000])。要求执行 q q q 次操作&…...
【八股文】ArrayList和LinkedList的区别
先讲讲两者是如何实现的 ArrayList public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {transient Object[] elementData; private int size; } 通过源码可以看出,ArrayLis…...
函数的引用/函数的默认参数/函数的占位参数/函数重载
函数的引用 #include<iostream> using namespace std;//引用的本质在c内部实现,是一个指针常量//交换函数 //1.值传递 void mySwap01(int a, int b) {int temp a;a b;b temp; }//2.地址传递 void mySwap02(int *a, int *b) {int temp *a;*a *b;*b temp…...
《鸿蒙系统下AI模型训练加速:时间成本的深度剖析与优化策略》
在当今数字化浪潮中,鸿蒙系统凭借其独特的分布式架构与强大的生态潜力,为人工智能的发展注入了新的活力。随着AI应用在鸿蒙系统上的日益普及,如何有效降低模型训练的时间成本,成为了开发者与研究者们亟待攻克的关键课题。这不仅关…...
