事务和连接池配合使用存在的问题

news2024/10/6 0:31:20

文章目录

  • 前言
  • 例子
  • 结果
  • 源码

前言

今天讨论一个问题,如果全部方法都加上事务,会不会有问题?

前两天看到一个老项目,xml方式的配置,拦截了所有的方法,增加了事务,不能说它的做法有问题,也不能说不对。

例子

下面hikari配置了一个连接池:

最大个数20个,获取链接等待5秒

spring:
  application:
    name: data-import
  datasource:
    url: jdbc:mysql://localhost:3306/data-import?useSSl=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      minimum-idle: 5
      idle-timeout: 1000
      maximum-pool-size: 20
      auto-commit: true
      pool-name: datimportpool
      max-lifetime: 1800000
      connection-timeout: 5000
      connection-test-query: SELECT 1

再增加一个接口

注意:这里我增加了线程睡眠时间,模拟业务处理慢的情况

@RestController
@RequestMapping("/test")
public class TestController {

    @Transactional
    @GetMapping("/get")
    public Object get() throws InterruptedException {
        TimeUnit.SECONDS.sleep(2);
        return "xx";
    }
}

结果

我们用jmeter压测看看

100的并发量,吞吐量只有14,并且还有异常的

image-20240201212439894

image-20240201213234030

image-20240201213213760

异常就是获取connection超时:

image-20240201212538110

我们查看下mysql它默认的链接数

# 查看mysql的最大链接数
show variables like '%max_connections%';

# 查看每个用户的最大链接数
show variables like 'max_user_connections';

image-20240201212733633

实际情况需要根据环境来进行配置,这里作为测试,修改应用的最大链接数到50

image-20240201213351516

image-20240201213406454

image-20240201213425101

结论:

  1. 业务处理慢的接口,会占用连接池资源,导致后续接口的等待,严重的导致超时异常;
  2. 加入了事务的方法,不论是否使用了jdbc,都会受限于数据库连接池的限制,也就是会产生性能瓶颈,虽然说连接池是为了提高系统性能,避免资源浪费,但是在业务处理慢的时候是相反的;

源码

上面我们是通过表象去看待问题,下面我们通过源码去看它的过程。

关于事务详细的源码分析看:spring源码篇(八)事务的原理-CSDN博客

spring事务有动态代理实现,实现逻辑在TransactionAspectSupport

org.springframework.transaction.interceptor.TransactionAspectSupport

image-20240202203151187

最后他会走到这个位置:

org.springframework.jdbc.datasource.DataSourceTransactionManager#doBegin

在这里他会通过dataSource获取一个connection

image-20240202203838274

看一下这个绑定的方法

image-20240202203912931

image-20240202203926150

这里以datasource为键,connectionHandle为value放到了resources中,而resources这个是线程变量ThreadLocal,只对当前线程有效,到这里,大概的一个流程我们梳理一下

image-20240202205703870

所以说当业务逻辑执行慢的时候,就会占用一个connection资源不释放,当连接池的Connection达到上限时就会使得后面的请求等待,当等待时间达到设置的超时时间就会抛出timeout的异常。

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

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

相关文章

〔Part1〕YOLOv5:原理+源码分析(配置文件、网络模块、损失函数、跨网格匹配策略)

1. 前置知识 1.1 YOLO 算法的基本思想 首先通过特征提取网络对输入图像提取特征,得到一定大小的特征图,比如 13x13(相当于416x416 图片大小),然后将输入图像分成 13x13 个 grid cells: YOLOv3/v4&#xf…

WebAssembly002 IDBFS 浏览器文件存储

1.文件系统 文件系统 API官方文档 https://emscripten.org/docs/api_reference/Filesystem-API.htmlJavaScript 通常在 Web 浏览器的沙盒环境中运行,没有 直接访问本地文件系统。Emscripten 模拟了一个文件系统。要访问的文件应预加载或嵌入到虚拟文件系统中。 2.…

从奥迪Quattro到碧然德:揭秘技术品牌成功打造与推广的秘诀

在当前全球化和信息化快速发展的背景下,技术品牌的打造不仅是企业竞争力提升的重要途径,也是企业实现长远发展的基石。通过深入剖析,我们认识到,技术品牌的建设并非一蹴而就的过程,而是需要企业准确把握市场趋势&#…

全球十大优质黄金期货交易平台app软件排行榜(2024版)

对于选择黄金期货交易平台app软件,有几个关键因素需要考虑。首先是app平台的声誉和信誉度;其次是app平台的交易费用和手续费。 第三是app平台的交易品种和交易功能;第四是app平台的安全性和风险控制措施;最后还要考虑app平台的客…

论文阅读-一个用于云计算中自我优化的通用工作负载预测框架

论文标题:A Self-Optimized Generic Workload Prediction Framework for Cloud Computing 概述 准确地预测未来的工作负载,如作业到达率和用户请求率,对于云计算中的资源管理和弹性非常关键。然而,设计一个通用的工作负载预测器…

Redis核心技术与实战【学习笔记】 - 24.Redis 数据分片方案选择:Codis 和 Redis Cluster

简述 Redis 的切片集群使用多个实例保存数据,能很好的应对大数据量的场景。在《4.Redis 切片集群》中,介绍了 Redis 官方提供的切片集群方法 Redis Cluster。本章,再来学习下,在 Redis Cluster 方案正式发布前,业界广…

C#,纽曼-康韦数(Newman Conway Number)的算法与源代码

John Henrry Newman 1 纽曼-康韦数 纽曼-康韦数(Newman Conway Number)序列是生成以下整数序列的序列。 1 1 2 2 3 4 4 4 5 6 7 7… 在数学上,纽曼-康韦数的序列P(n)由递推关系定义: (1) P&#xff08…

【C++历练之路】二叉搜索树的学习应用及其实现

W...Y的主页 😊 代码仓库分享💕 前言🍔: 我们之前学过一些查找关键数据的办法,排序二分查找。但是这种方法的插入的时间复杂的太高,今天我们来学习一个更好的办法来应对数据查找——二叉搜索树。 目录…

深入实战:ElasticSearch的Rest API与迭代器模式在高效查询中的应用

在我们公司,大多数Java开发工程师在项目中都有使用Elasticsearch的经验。通常,他们会通过引入第三方工具包或使用Elasticsearch Client等方式来进行数据查询。然而,当涉及到基于Elasticsearch Rest API的/_sql?formatjson接口时,…

Fink CDC数据同步(一)环境部署

1 背景介绍 Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 Flink CDC 是 Apache Flink 的一组源连接器,基于数据库日志的…

【深度学习】从0完整讲透深度学习第2篇:TensorFlow介绍和基本操作(代码文档已分享)

本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实…

leetcode(滑动窗口)3.无重复字符的最长字串(C++)DAY2

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示…

机器学习笔记-集成学习

机器学习笔记-集成学习 随机森林随机森林bagging和boostingGBDT 随机森林 随机森林 mac上optionenter即可导入包随机森林就是bagging决策树 总结 bagging和boosting 公式和例子 GBDT

Facebook的数字合作愿景:创新与未来发展

随着科技的飞速发展,Facebook一直处于数字创新的前沿,致力于构建开放、智能、社交的数字社交体验。本文将深入探讨Facebook的数字合作愿景,探索其在创新与未来发展方面的雄心壮志。 引言 在当今数字化时代,社交媒体不仅是人们沟通…

2 月 5 日算法练习- 字符串

人物相关性分析 思路:枚举前缀和。枚举字符串中的 Bob 位置利用前缀和来记录,然后枚举 Alice 的位置,通过判断 Bob 在 Alice 前面还是后面来进行不同的前缀和差值计算距离 k 距离中 Bob 的个数求和就是答案,复杂度是 On。注意 Bob…

Ubuntu使用Docker部署Nginx并结合内网穿透实现公网远程访问

文章目录 1. 安装Docker2. 使用Docker拉取Nginx镜像3. 创建并启动Nginx容器4. 本地连接测试5. 公网远程访问本地Nginx5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 在开发人员的工作中,公网远程访问内网是其必备的技术需求之一。对于…

OpenResty 安装

安装OpenResty 1.安装 首先你的Linux虚拟机必须联网 1)安装开发库 首先要安装OpenResty的依赖开发库,执行命令: yum install -y pcre-devel openssl-devel gcc --skip-broken2)安装OpenResty仓库 你可以在你的 CentOS 系统中…

Redis核心技术与实战【学习笔记】 - 14.Redis 旁路缓存的工作原理及如何选择应用系统的缓存类型

概述 我们知道,Redis 提供了高性能的数据存取功能,广泛应用在缓存场景中,既可以提升业务的响应速度,又可以避免把高并发的请求发送到数据库。 如果 Redis 做缓存时出现了问题,比如说缓存失效,那么&#x…

【LeetCode: 292. Nim 游戏+ 博弈问题】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

openssl3.2 - use openssl cmd create ca and p12

文章目录 openssl3.2 - use openssl cmd create ca and p12概述笔记实验的openssl环境建立CA生成私钥和证书请求生成CA证书用CA签发应用证书用CA对应用证书进行签名将已经签名好的PEM证书封装为P12证书验证P12证书是否可用END openssl3.2 - use openssl cmd create ca and p12 …