代码改成多线程,竟有 这些问题

news2025/1/11 13:55:06

文章目录

  • CPU 使用率飙高
  • 事务问题
  • 导致服务挂掉

CPU 使用率飙高

每条数据都有些业务逻辑,如果单线程导入所有的数据,导入效率会非常低。于是改成了多线程导入。

如果 excel 中有大量的数据,很可能会出现 CPU 使用率飙高的问题。
我们都知道,如果代码出现死循环,cpu 使用率会飚的很多高。

因为代码一直在某个线程中循环,没法切换到其他线程,cpu 一直被占用着,所以会导致 cpu 使用率一直高居不下。
而多线程导入大量的数据,虽说没有死循环代码,但由于多个线程一直在不停的处理数据,导致占用了 cpu 很长的时间。也会出现 cpu 使用率很高的问题。

那么,如何解决这个问题呢?

答:使用 Thread.sleep 休眠一下。
在线程中处理完一条数据,休眠 10 毫秒
当然 CPU 使用率飙高的原因很多,多线程处理数据和死循环只是其中两种,
还有比如:频繁 GC、正则匹配、频繁序列化和反序列化等。

事务问题

在实际项目开发中,多线程的使用场景还是挺多的。如果 spring 事务用在
多线程场景中,会有问题吗?
例如:

	@Slf4j
    @Service
    public class UserService {
        @Autowired
        private UserMapper userMapper;
        @Autowired
        private RoleService roleService;

        @Transactional
        public void add(UserModel userModel) throws Exception {
            userMapper.insertUser (userModel);
            new Thread (() -> {
                roleService.doOtherThing ();
            }).start ();
        }
    }

    @Service
    public class RoleService {
        @Transactional
        public void doOtherThing() {
            System.out.println ("保存 role 表数据");
        }
    }

从 上 面 的 例 子 中 , 我 们 可 以 看 到 事 务 方 法 add 中 , 调 用 了 事 务 方 法doOtherThing,但是事务方法 doOtherThing 是在另外一个线程中调用的。
这样会导致两个方法不在同一个线程中,获取到的数据库连接不一样,从而是两个不同的事务。如果想 doOtherThing 方法中抛了异常,add 方法也回滚是不可能的。
如果看过 spring 事务源码的朋友,可能会知道 spring 的事务是通过数据
库连接来实现的。当前线程中保存了一个 map,key 是数据源,value 是数
据库连接。

private static final ThreadLocal<Map<Object, Object>> resources =
		new NamedThreadLocal<>("Transactional resources");

我们说的同一个事务,其实是指同一个数据库连接,只有拥有同一个数据库连 接才能同时提交和回滚。如果在不同的线程,拿到的数据库连接肯定是不一样 的,所以是不同的事务

所以不要在事务中开启另外的线程,去处理业务逻辑,这样会导致事务失效

导致服务挂掉

使用多线程会导致服务挂掉,这不是危言耸听,而是确有其事。

假设现在有这样一种业务场景:在 mq 的消费者中需要调用订单查询接口,查到数据之后,写入业务表中。本来是没啥问题的。

突然有一天,mq 生产者跑了一个批量数据处理的 job,导致 mq 服务器上堆积了大量的消息。
此时,mq 消费者的处理速度,远远跟不上 mq 消息的生产速度,导致的结果是出现了`大量的消息堆积``,对用户有很大的影响

为了解决这个问题,mq 消费者改成多线程处理,直接使用了线程池,并且最大线程数配置成了 20
这样调整之后,消息堆积问题确实得到了解决。
但带来了另外一个更严重的问题:订单查询接口并发量太大了,有点扛不住压力,导致部分节点的服务直接挂掉

在这里插入图片描述

为了解决问题,不得不临时加服务节点。

在 mq 的消费者中使用多线程,调用接口时,一定要评估好接口能够承受的最大访问量,防止因为压力过大,而导致服务挂掉的问题

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

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

相关文章

公众号免费查题系统

公众号免费查题系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

8.for循环

循环控制语句 1.for循环 for (表达式1&#xff1b;表达式2&#xff1b;表达式3) { //复合语句&#xff0c;循环体 } 第一次进入循环的时候执行表达式1&#xff0c;表达式1只执行一次 表达式2是循环的条件&#xff0c;只有表达式2为真了&#xff0c;才执行循环体&#xff0c;也…

Android 应用模块的构建

Google文档说明&#xff1a;https://developer.android.com/studio/build?hlzh-cn Android 构建系统会编译应用资源和源代码&#xff0c;然后将它们打包成 APK 或 Android App Bundle 文件&#xff0c;供您测试、部署、签名和分发。Android Studio 使用高级构建工具包 Gradle …

Python学习----面向对象

面向对象思想就不说了&#xff0c;和java一样。这是为了自己能够一直看教程不走神做得笔记。 类的定义和赋初值 成员变量和成员方法&#xff0c;含义和java一样。 成员变量的申明没啥好记得 需要关注得是成员方法&#xff0c;在定义成员方法得时候&#xff0c;需要传入self关…

设计模式学习笔记 - 组合模式

设计模式学习笔记 - 组合模式一、学校院系展示问题二、传统方案解决学校院系展示问题三、组合模式介绍1、基本介绍2、组合模式原理四、组合模式解决学校院系展示问题五、组合模式在JDK集合的源码分析六、组合模式的注意事项和细节一、学校院系展示问题 展示一个学校院系结构&am…

机器学习可视化技术(Towards Data Science)

介绍 作为任何数据科学项目的一部分&#xff0c;数据可视化在了解更多可用数据和识别任何主要模式方面发挥着重要作用。 如果能够使分析中的机器学习部分尽可能直观&#xff0c;那不是很好吗&#xff1f; 在本文中&#xff0c;我们将探讨一些可以帮助我们应对这一挑战的技术&am…

HCIA 链路聚合与LACP

一、前言 虽然很多文章在介绍链路聚合时会从链路备份的角度来介绍链路聚合的作用&#xff0c;然后再说其有提升链路带宽的作用&#xff0c;但我感觉链路聚合主要还是提升链路带宽的作用&#xff0c;链路备份只是顺带的不是主要目标。 二、链路聚合 考虑下面的网络&#xff0…

Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端

基于 TCP 的服务器端/客户端 绝大多数 TCP 服务器端都按照如下顺序调用&#xff1a; 在 Windows 环境下&#xff0c;代码表示为&#xff1a; WSADATA wsaData;SOCKET hServSock, hClntSock;SOCKADDR_IN servAddr, clntAddr;int szClntAddr;/*Windows 环境 Socket 编程必须*/i…

leetcode:6243. 到达首都的最少油耗【变种子树大小统计 + 从边的角度出发 + 思维转换】

目录题目截图题目分析ac code总结题目截图 题目分析 0作为root从边的角度出发每个点都向0的方向聚集比如大家已经由四面八方聚集到了x&#xff0c;x的fa固定的&#xff0c;假设为y那么x到y要多少辆车&#xff1f;设size&#xff08;x&#xff09;为x子树大小x到y需要ceil&…

2022年第十三届蓝桥杯大赛湖南中医药大学第2场选拔赛(部分总结)

文章目录2008: 简单整数问题2005: 飞行棋2074: 几乎回文串2101: 通行密令2089: 密码1867: X星救援站2085: 千里走单骑2093: 最长等比子序列2087: 跳水比赛总结2008: 简单整数问题 [命题人 : admin] 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 小明最近经常会思考一些关…

Oracle-AWR快照无法自动生成问题分析

前言: 近期处理了一起数据库AWR快照无法自动生成的问题&#xff0c;用户发现数据库在近期出现了AWR快照无法自动生成的问题&#xff0c;数据库整体负载正常&#xff0c;后面分析发现原因是由于AWR快照在生成过程中&#xff0c;执行的SQL语句出现超时导致。 问题: Oracle11.2.…

【课上笔记】第八章 图

图 8.1图的基本概念 8.1.1图的定义和术语 1&#xff0e;图的定义 ​ 图(Graph)由一个顶点集合Vn和一个边&#xff08;或者弧&#xff09;集合En组成&#xff0c;通常记为&#xff1a; G&#xff1d;(Vn,En)其中&#xff0c;Vn中有n(n>0)个顶点&#xff0c;En中有e&#…

stm32cubemx hal学习记录:FreeRTOS任务管理

一、基本配置 1、配置RCC、USART1、时钟84MHz 2、配置SYS&#xff0c;将Timebase Source修改为除滴答定时器外的其他定时器&#xff0c;因为滴答定时器被用于时钟基准&#xff0c;可以实现任务切换。Timebase Source是实现HAL_Delay等延时函数的 3、初始化LED的两个引脚 4、开…

HTTP VS HTTPS

一、网络协议 网络协议是计算机之间为了实现网络通信而达成的一种“约定”或者”规则“&#xff0c;有了这种”约定“&#xff0c;不同厂商的生产设备&#xff0c;以及不同操作系统组成的计算机之间&#xff0c;就可以实现通信。 二、HTTP与HTTPS 1、HTTP &#xff08;1&am…

Autoware中的点云3D聚类算法,保姆级算法阅读注释,一看就懂,非常详细!

综述 五大模块&#xff0c;看完等于点云入门~&#xff08;dog&#xff09; 实际步骤 输入激光雷达获得的点云 pcl::PointCloud<pcl::PointXYZ>::Ptr header:seq:序列长度stamp:获取点云的时刻frame_id:坐标系名称 points:保存点云的容器,类型为std::vector width:类型…

大小端的判断

1.关于进制 1.1 进制数与位数 n进制数中&#xff0c;一位最多表示到数字n-1 十进制中1位最多能表示9个数字 满则溢&#xff0c;溢则进位。 拿我们最常用的是10 进制来举例说明&#xff0c; 构成十进制的最小单位数: 1 2 3 4 5 6 7 8 9 0 十进制(其实只有从9到0这几个数字,1…

OSPF笔记(四):OSPF五种报文和五种常见LSA

一、OSPF五种报文 (使用IP承载&#xff0c;可靠&#xff09; 1.1 hello&#xff1a; 发现和维护邻居关系 &#xff0c;以太网10s一次 1.2 DBD&#xff1a; 发送链路状态数据库摘要 1.3 LSR&#xff1a; 请求发送特定的链路状态信息&#xff08;请求包&#xff09; 1.4 LSU&…

Pr2023(Premiere Pro)中文版软件下载「附带安装教程」

Premiere Pro 23.0 版专为帮助编辑人员制作创意内容而设计&#xff0c;提供了出色的字幕工具组合。借助改进功能&#xff08;如批量编辑时间轴中的标题剪辑、灵活的对齐控件等&#xff09;简化您的标题和图形工作流程。此版本包含稳定性和性能方面的基础改进&#xff0c;包括更…

用 Flutter 轻松做个红包封面

前言 在 Flutter 的开发中&#xff0c;最常见的就是层层的组件嵌套&#xff0c;因此不可避免会遇到子组件如何适配父组件的问题。比如&#xff0c;按钮的可点击区域是否要占满整个父组件&#xff1f;图片是居中还是居左&#xff1f;这些问题可以通过 Flutter 提供的FittedBox …

Rancher - 更换Linux发行版

Rancher - 更换Linux发行版 时间&#xff1a;2022年11月20日21:24:29 推荐&#xff1a;Linux CentOS7.9 一、为什么要更换/升级&#xff1f; CentOS7.9 停止维护时间 2024年06月30日 AnolisOS8 阿里云推出的Linux发行版&#xff0c;支持多计算架构&#xff0c;也面向云端场景…