spring提高并发能力

小型系统一般都是在controller直接处理接口逻辑,这样占用的是tomcat的工作线程

(1)这个线程是有数的,不能无限大

(2)这个线程同时负责接收处理请求,如果被占满,这无法接收新来的请求,导致并发数很低

这时候要引入异步处理的概念,系统中实例化出另一个线程池,用来处理业务工作。

而controller只用来接收请求,并且将业务工作提交到新的线程池。

这样虽然系统硬件配置并未改变,但能够同一时间接收的请求数变多,并且负责工作的线程池会有工作队列,不会像之前那样将请求拒之门外,直到超时丢失。

当前并不是所有的接口都要这么写,只是对于耗时久的接口单独处理即可。

避免耗时久的接口工作时,占满tomcat工作线程,导致其他正常工作的接口无法正常响应。

具体实例:

新建工作线程池

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;
import java.util.concurrent.Executors;@Configuration
public class AsyncConfig {@Bean(name = "asyncExecutor")public Executor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(200); // 设置核心线程池大小executor.setMaxPoolSize(200); // 设置最大线程池大小executor.setQueueCapacity(300); // 设置队列容量executor.setThreadNamePrefix("async-"); // 设置线程名前缀executor.initialize(); // 初始化线程池return executor;}
}

controller处理

@RestController
@RequestMapping("/async")
public class AsyncController {@Resourceprivate Executor asyncExecutor;@Resourceprivate TestMapper testMapper;@GetMapping("/test")public CompletableFuture<String> asyncResponse(@RequestParam(name="id")String id) {System.out.println(id); //标记controller是不是在接收请求return CompletableFuture.supplyAsync(() -> {/***********************************这里就开始处理任务***************************************/try {Thread.sleep(10000); // 假设需要10秒完成处理}catch (Exception e){}/***********************************这里处理结束,返回结果***************************************/return "成功"+testMapper.getCount();}, asyncExecutor);}}

注意最后的返回类型用CompletableFuture包裹。

修改tomcat配置,可以看到tomcat.threads.max=1,实际上通过测试工具发起100次请求,发现都被接收了,并且在处理。发起200次则部分连接被拒绝,因为tomcat.max-connections设置的是100,这个只是一个限制条件,根据系统的承载能力设置,测试时可以调大。

server:tomcat:max-swallow-size: -1    # 请求大小过滤,单位字节max-connections: 100accept-count: 1threads:max: 1

为了明显异步处理的效果,可以换成如下普通的接口再次测试。

    @GetMapping("/test")public String asyncResponse(@RequestParam(name="id")String id) {System.out.println(id);try {Thread.sleep(10000); // 假设需要5秒完成处理}catch (Exception e){}return "成功"+testMapper.getCount();}

就可以发现系统只能一个个处理,其他请求都在排队。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024深圳杯东三省数学建模ABC选题建议详细思路分析

2024东三省/深圳杯ABC题详细思路分析和选题建议 ABC三题难度分析 A<C<B 我们将同时做ABC中的两题&#xff0c;今天可以给全部的代码&#xff0c;明天凌晨给全部的文章 B难点&#xff1a;工件要怎么处理 pdf文件的处理 C难点&#xff1a;你需要自行找到不同编译结果的主…

基于FPGA轻松玩转AI

启动人工智能应用从来没有像现在这样容易&#xff01;受益于像Xilinx Zynq UltraScale MPSoC 这样的FPGA&#xff0c;AI现在也可以离线使用或在边缘部署、使用.可用于开发和部署用于实时推理的机器学习应用&#xff0c;因此将AI集成到应用中变得轻而易举。图像检测或分类、模式…

Python写个二维码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、进入官网下载二、下载一下三.输入代码 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、进入官网下载 官网 pip insta…

word删除单页的页眉

在Microsoft Word中&#xff0c;如果您想删除单页的页眉而不是整个文档的页眉&#xff0c;您需要确保该页位于一个独立的节中&#xff0c;或者调整其页眉设置以使其不同于其他页面。以下是如何删除单页页眉的步骤&#xff1a; 打开Word文档&#xff1a;首先&#xff0c;打开包含…

vue3推荐算法

Vue 3 推荐算法主要指的是在 Vue 3 框架中实现的或者适用于 Vue 3 的算法库或组件库。Vue 3 由于其优秀的设计和性能&#xff0c;被广泛应用于构建各种类型的应用程序&#xff0c;包括需要复杂算法支持的项目。以下是一些在 Vue 3 中可能会用到的推荐算法资源&#xff1a; Vue-…

田忌赛马【洛谷P1650】

P1650 田忌赛马 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<iostream> #include <algorithm> #include<cstdio> #include <map> using namespace std; const int N1e5100; int n; map<int,int>a,b;//映射&#xff0c;速度->数量…

新网站上线需要注意什么?

质量保证&#xff1a;确保网站的所有功能和页面都经过了充分的测试&#xff0c;并且在各种不同的浏览器和设备上都能够正常运行。检查所有链接、表单和交互式元素&#xff0c;确保它们都能够按照预期工作。优化性能&#xff1a;确保网站加载速度快&#xff0c;响应迅速。优化图…

Python-VBA函数之旅-isinstance函数

目录 一、isinstance函数的常见应用场景&#xff1a; 二、isinstance函数使用注意事项&#xff1a; 三、如何用好isinstance函数&#xff1f; 1、isinstance函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff…

使用 NVM 管理 Node.js 版本

在软件开发中&#xff0c;管理项目所依赖的运行环境版本是一项挑战&#xff0c;尤其是在使用 Node.js 这样频繁更新的平台时。Node Version Manager&#xff08;NVM&#xff09;是一种流行的工具&#xff0c;它允许开发者在同一台机器上安装和使用多个 Node.js 版本。本文将介绍…

基于spring boot学生综合测评系统

基于spring boot学生综合测评系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件…

typedef 定义函数指针

typdef int(*FUNC_TYPE)(int,int) FUNC_TYPE p NULL; 定义了一个函数指针 函数指针作为函数的参数的用法demon

代码随想录训练营26day-贪心算法4

一、860 柠檬水找零 题目解析&#xff1a;注意一开始是没有零钱&#xff0c;也只会取5 10 20三类数字&#xff0c;因此从这3类数字出发&#xff0c;去判断。 1 如果是5元&#xff0c;那么直接收&#xff0c;five&#xff1b; 2 如果是10元&#xff0c;那么需要five--&#x…

黄金行情下跌有投资机会吗?

尽管黄金价格的波动常常引起投资者的高度关注&#xff0c;但行情的下跌未必只是警讯&#xff0c;亦可能蕴藏着某些难得的投资机会。总之&#xff0c;答案是肯定的——在黄金行情下跌时&#xff0c;依旧有适宜的投资机会&#xff0c;只是这需要投资者具备相应的应对知识和策略。…

微信小程序实现蓝牙连接通讯

由于最近的项目在做小程序蓝牙通讯这块的内容&#xff0c;所以将实现的过程在这简单的记录下。 1、首先要初始化蓝牙-检查蓝牙适配器是否打开 async initBluetooth(): Promise<void> {return new Promise((resolve: any, reject: any) > {const _this thisif (Bluet…

美森快船和以星快船有什么区别?美线海运都有哪些快船?

在繁忙的国际海运市场中&#xff0c;快船服务以其高效、快捷的特点受到广大货主的青睐。其中&#xff0c;美森快船和以星快船作为知名的海运服务提供商&#xff0c;凭借着卓越的服务品质&#xff0c;在航运界树立了良好的口碑。那么&#xff0c;美森快船和以星快船究竟有何不同…

利用ollama和open-webui本地部署通义千问Qwen1.5-7B-Chat模型

目录 1 安装ollama 2 安装open-webui 2.1 镜像下载 3 配置ollama的模型转换工具环境 3.1 下载ollama源码 3.2 下载ollama子模块 3.3 创建ollama虚拟环境 3.4 安装依赖 3.5 编译量化工具 7 创建ollama模型 8 运行模型 参考文献&#xff1a; 1 安装ollama curl -fsSL …

【CCF推荐-C类】计算机学术会议截稿信息2条

中国计算机学会推荐国际学术会议和期刊目录自2010年8月首次发布以来&#xff0c;已历经五版&#xff0c;得到了计算机领域科研工作者的广泛关注。 目录共包含十个领域&#xff0c;分为ABC三类&#xff1a;A类是国际上极少数顶会与顶刊&#xff1b;B类代表领域内高水平的会议与…

2-2 任务:闰年判断

本次课&#xff0c;我们讨论了闰年的判断方法、关系运算符与关系表达式、逻辑运算符与逻辑表达式&#xff0c;以及流程控制结构中的选择结构。 闰年判断 闰年是为了使日历年与地球绕太阳公转的时间保持一致而设定的&#xff0c;具有366天。闰年的判断规则如下&#xff1a; 普…

16V/2A高集成功率MOS同步降压转换器SOT23-6封装

概述&#xff1a; PCD8020 是一款内部集成两个功率 MOS 的高效率 2A 同步整流降压转换器。 该器件提供PWM 与 PFM 两种控制模式&#xff0c; 能够在很宽的负载范围内实现高效率。PCD8020 采用小巧的 SOT23-6 封装&#xff0c; 外围器件少&#xff0c; 从而实现小尺寸的系统电源…

【算法】约瑟夫环

文章目录 题目一1.数组模拟1.1出圈顺序递归求出圈顺序 1.2最后出圈人 2.环形链表【DEMO】3.递推求最后出圈人3.13.2 题目二1.数组模拟2.递推求最后出圈人2.12.2 题目一 1-n编号 s开始1-m报数 报到m出圈 求出圈顺序or最后人 1.数组模拟 1.1出圈顺序 递归求出圈顺序 // AC输入…