数据库调优-连接池优化

先贴下连接池的相关配置

  • 连接池参数配置:
字段含义
Max Number of Connections最大连接数;做性能测试时,可以填 0 。在开发的项目中按实际代码填写,默认是 20 。
Max Wait(ms)在连接池中取回连接最大等待时间,单位毫秒
Time Between Eviction Runs(ms)线程可空闲时间,单位毫秒如果当前连接池中某个连接在空闲了 time Between Eviction Runs Millis 时间后任然没有使用,则被物理性的关闭掉
Auto Commit自动提交sql语句,如:修改数据库时,自动 commit
Transaction isolation事务隔离级别
Preinit Pool立即初始化连接池如果为 False,则第一个 JDBC 请求的响应时间会较长,因为包含了连接池建立的时间
  • Transaction Isolation: 事务间隔级别设置,主要有如下几个选项:(对JMX加解密)

    • TRANSACTION_NODE 事务节点
    • TRANSACTION_READ_UNCOMMITTED 事务未提交读
    • TRANSACTION_READ_COMMITTED 事务已提交读
    • TRANSACTION_SERIALIZABLE 事务序列化
    • DEFAULT 默认
    • TRANSACTION_REPEATABLE_READ 事务重复读、

看到这,有些小伙伴,可能要溜了,别慌,且听我一一道来!!!上干货,安排。。。

image.png

2.连接池优化

加不加连接池,对当前服务性能产生什么影响?

单个服务也会耗尽连接?

  • 会不会对性能产生影响呢?会扣 1 , 不会扣 2 , 性能会变好扣 3
  • 最大连接数越大是不是性能越好呢?
  • 获取池中连接的最大等待时长?等待时间越短越好呢?

2.1JMeter优化

image.png

看到这里,是不是有点眼熟?

就是刚贴的,连接池参数配置

这里我们先对JMeter进行优化下,字体外观

  • 切换到中文

image.png

找到jmeter.properties文件,添加下面配置:

language=zh_CN

然后重启下JMeter即可。

  • 外观,有黑色改成白色

image.png

2.2 不使用连接池

有什么问题呢?会报错

  • 如果你不是多个应用程序同时连接MySQL,问题不大。但是如果你是多个应用程序连接数据库。
  • 每个应用并发去获取数据库连接,会导致连接耗尽,资源争抢冲突!

这里,我们创建一个计划,去测试下:

image.png

线程数: 20

ramp-up: 1

循环次数: 2000

image.png

  • 执行,查看结果树

image.png

可以看到,当不使用线程池时,很快,就报下面这个错了:

 

php

复制代码

Response message:java.sql.SQLException: Cannot create PoolableConnectionFactory (Data source rejected establishment of connection, message from server: "Too many connections")

  • 查看聚会报告

image.png

2.3 连接池参数设置

压力测试连接池参数设置:

2.3.1 MaxWait

参数表示从连接池获取连接的超时等待时间,单位毫秒。

注意:这个参数只管理获取连接的超时。获取连接等待的直接原因池子里没有可用连接,具体包括如下四种情况:

  • 连接池未初始化
  • 连接长久未使用已被释放,
  • 连接使用中需要新建连接
  • 连接池已耗尽需等待连接用完后归还

这里有一个很关键的点是 maxWait 未配置或者配置为 0 时,表示不设等待超时时间。也就是无限制等待

如果不配置maxWait,后果会怎么样呢?可能有些应用就这么干,来做个案例:

 

properties

复制代码

maxWait=0, maxActive=5,

对应JMeter的配置如下:

image.png

正常流量下业务没有发现任何问题,但突发大流量涌入时,造成连接池耗尽,所有新增的DB请求处于等待获取连接的状态中。

由于 maxWait=0 表示无限等待,在请求速度大于处理速度的情况下等待队列会越排越长,最终业务上的表现就是业务接口大量超时,流量越大造成实际吞吐量反而越低。

线程数 5 :

1658996535095(1).jpg

image.png

异常率:38%

线程数 10 :

image.png

image.png

异常率:50%

线程数 20 :

image.png

image.png

异常率:62%

由上可见,很明显,随着线程数增加,异常率不断增加。

配置建议:如果在内网,网络情况良好的情况下,maxWait应该设置为 800 毫秒。如果在外网,网络状况不佳值可以设置为 1200 毫秒。TCP重连的时间是 1 秒。

image.png

  • 如果MaxWait值很大,会出现高并发情况下,获取不到连接,响应时间变长,吞吐量下降
  • 如果Maxwait值很小,会出现吞吐量奇高,但是异常数也奇高。

重点了,兄弟们。

maxWait,配置,get!!!

2.3.2 MaxActive
 

yaml

复制代码

线程数: 20 ramp-up: 1 循环次数: 2000

最大连接池数量,允许的最大同时使用中的连接数。

注意:配置 maxActive 千万不要好大喜多,虽然配置大了看起来业务流量飙升后还能处理更多的请求,但切换到DB视角会发现其实连接数的增多在很多场景下反而会减低吞吐量,一个非常典型的例子就秒杀,在更新热点数据时DB 需要加锁操作,这个时候再让更多的连接操作DB就有点像假日往高速上涌入的车辆,只会给DB添堵。

最大连接: 10

image-20220727232753636.png

最大连接数: 20

image-20220727232818351.png

最大连接数: 30

image-20220727232841966.png

配置建议:大多数场景下,配置 20 即可,足够使用的!建议结合实际业务场景设置,在业务系统稳定运行一段时间之后,获取稳定连接数,在这个基础之上乘以3-4即可!

为什么最大连接数设置的过多并不是一件好事? 是不是设置的连接数越多,性能就越好呢?不是!

  • 首先,数据库的连接是非常宝贵的资源,很有限?数据库的最大连接数是多少? 151
  • 其次, 20 个连接足以支持到足够的TPS
  • 再次,如果设置最大的连接数过多了,会造成资源争抢。从而出现服务器报错!设置连接过多,没有提升性能反而性能下降
  • 在绝大多数业务场景下, 10 、 20 、 30 都足以支撑!

哈哈,这个参数,很重要喔,不记下来嘛?

image.png

 

csharp

复制代码

# 查看数据库最大支持的连接数 SHOW variables like 'max_connections'; //151 # 查看数据库最大使用的连接数 SHOW variables like 'max_user_connections'; //0

2.4 连接属性设置

之前在配置JDBC的连接池的时候讲过两个参数:serverTimezone=UTC&characterEncoding=utf-8。

接下来再说两个参数在网络方面有很大作用;主要应对在网络异常模式下,数据库无法释放连接的问题;

  1. connectTimeout: 表示等待和MySQL数据库建立socket链接的超时时间。

    • 如果与服务器(这里指数据库)请求建立连接的时间超过ConnectionTimeOut,就会抛连接超时异常,即服务器连接超时。
  2. socketTimeout: 表示客户端和MySQL数据库建立socket后,读写socket时的等待的超时时间

    • 如果与服务器连接成功,就开始数据传输了。如果服务器处理数据用时过长,超过了SocketTimeOut,就会抛出SocketTimeOutExceptin,即服务器响应超时,服务器没有在规定的时间内返回给客户端数据。
 

properties

复制代码

jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC&characterEncoding=utf-8&connectionTimeout=3000&socketTimeout=1200

解释:

  • 一个请求包含三个过程:1.建立连接,2,数据传输,3.断开连接
  • connectTimeout默认值 0 ,你连接超时。
  • socketTimeout默认值,采用Linux操作系统的配置,默认值 30 分钟。

建议配置:connectTimeout 3000,socketTimeout 1200

  下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux 6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 10、开放性测试题,11、安全测试,12、计算机基础

​编辑资料获取方式 :xiaobei_upup,添加时备注“csdn alex”

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

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

相关文章

Optional学习记录

Optional出现的意义 在Java中,我们经常遇到的一种异常情况:空指针异常,在原本的编程中,为了避免这种异常,我们通常会向对象进行判断,然而,过多的判断语句会让我们的代码显得臃肿不堪。 所以在J…

ETL工具kettle(PDI)入门教程,Transform,Mysql->Mysql,Csv->Excel

什么是kettle,kettle的下载,安装和配置:ETL免费工具kettle(PDI),安装和配置-CSDN博客 mysql安装配置:Linux Centos8 Mysql8.3.0安装_linux安装mysql8.3-CSDN博客 1 mysql -> mysql 1.1 mysql CREATE TABLE user_…

《黑暗之魂》系列迎来打折:魂三标准版半价134,豪华版199

《黑暗之魂》系列游戏降价促销,现在是购买的好时机!想必喜欢挑战和探索的玩家们对这个消息会特别感兴趣。让我们来看看具体的折扣信息吧! 首先是《黑暗之魂:重制版》,原价198元,现价仅为99元!这…

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径: D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接:https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

密码学《图解密码技术》 记录学习 第十三章

目录 第十三章 13.1 本章学习的内容 13.2 PGP 简介 13.2.1 什么是 PGP 13.2.2 关于 OpenPGP 13.2.3关于GNU Privacy Guard 13.2.4 PGP 的功能 公钥密码 数字签名 单向散列函数 证书 压缩 文本数据 大文件的拆分和拼合 13.3 生成密钥对 13.4 加密与解密 13.4.1 加密 生成…

电脑显示丢失mfc140u.dll怎么修复,总共有7个方法

mfc140u.dll 是一个动态链接库(Dynamic Link Library)文件,它是Microsoft Foundation Class (MFC)库的一部分,专为使用C编程语言开发Windows应用程序而设计。MFC库由微软提供,作为一个高级的应用程序框架,旨…

数据分析——业务指标量化

业务指标量化 前言一、统计指标二、统计指标特点完整的统计指标统计指标的理解和使用方法 三、统计指标类型总量指标时期指标时点指标总量指标的作用 相对指标计划完成相对数指标结构相对数指标比例相对数指标比较相对数指标动态相对数指标 平均指标 四、数量指标和质量指标五、…

【JVM】从硬件层面和应用层面的有序性和可见性,到Java的volatile和synchronized

Java的关键字volatile保证了有序性和可见性,这里我试着从底层开始讲一下有序性和可见性。 一,一致性 数据如果同时被两个cpu读取了,如何保证数据的一致性?或者换句话说,cpu1改了数据,cpu2的数据就成了无效…

Final Draft 12 for Mac:高效专业剧本创作软件

对于剧本创作者来说,一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件,凭借其卓越的性能和丰富的功能,让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…

QML及VTK配合构建类MVVM模式DEMO

1 创建QT QUICK项目 这次我们不在主程中加载VTK的几何; 在qml建立的控件,创建MyVtkObject类的单例,main中将指针和单例挂钩; 在MyVtkObject实例中操作 QQuickVTKRenderItem 类即可; 由于VTK的opengl显示是状态机&a…

Bpmn.js使用(仅查看版)

Bpmn.js使用&#xff08;仅查看版&#xff09; 下载 npm install bpmn-js创建一个 Dom 节点来挂载画布元素。 <a-tabs v-model:activeKey"activeKey" change"tabsChange"><a-tab-pane key"1" tab"审批记录"><a-tabl…

保护宝贵的历史财富——博物馆文物管理

文物是一个国家的瑰宝&#xff0c;承载着历史的记忆和文化的传承及精髓。为了保护这些珍贵的文化遗产&#xff0c;仓库管理尤为重要。仓库管理的目的是确保文物的完整性、安全性和可持续保护&#xff0c;并为研究、展览和教育提供支持。 首先&#xff0c;文物仓库管理注重文物的…

前端css中径向渐变(radial-gradient)的使用

前端css中径向渐变的使用 一、前言二、主要内容说明&#xff08;一&#xff09;、径向渐变的形状1.椭圆形渐变&#xff08;ellipse&#xff09;&#xff0c;源码12.源码1运行效果3.圆形渐变&#xff08;circle&#xff09;&#xff0c;源码24.源码2运行效果 &#xff08;二&…

Windows安装RabbitMQ教程(附安装包)

需要两个安装包 Erlang 安装包: https://download.csdn.net/download/Brevity6/89274663 (自己从官网下载也可以) RabbitMQ Windows 安装包&#xff1a; https://download.csdn.net/download/Brevity6/89274667 (自己从官网下载也可以) Erlang安装 Erlang安装傻瓜式下一…

数据结构05:树与二叉树 习题01[C++]

考研笔记整理&#xff0c;本篇作为树与二叉树的基本概念习题&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构05&#xff1a;树与二叉树[C]-CSDN博客~&#x1f95d;&#x1f95d; 第1版&#xff1a;王道书的课后习题~&#x1…

DenseCLIP论文讲解

文章目录 简介方法总体框架 &#xff08;Language-Guided Dense Prediction&#xff09;上下文感知提示 &#xff08;Context-Aware Prompting&#xff09;应用实例 论文&#xff1a;DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting 代码&#xff1…

最全软件测试面试问题和回答,适合全文背诵

求职&#xff0c;类似于打仗&#xff0c;是一场挑战自己的战斗&#xff0c;也是一场跟用人单位的博弈&#xff0c;更是一场千人过独木桥的厮杀、混战。《孙子谋攻篇》中早就说了&#xff1a;"知己知彼&#xff0c;百战不殆&#xff1b;不知彼而知己&#xff0c;一胜一负&a…

python数据分析——数据的选择和运算

数据的选择和运算 前言一、数据选择NumPy的数据选择一维数组元素提取示例 多维数组行列选择、区域选择示例 花式索引与布尔值索引布尔索引示例一示例二 花式索引示例一示例二 Pandas数据选择Series数据获取DataFrame数据获取列索引取值示例一示例二 取行方式示例loc() 方法示例…

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时&#xff0c;报如上图所示错误&#xff0c;其中一条是&#xff1a; ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…

10.轮转数组

文章目录 题目简介题目解答解法一&#xff1a;使用额外的数组代码&#xff1a;复杂度分析&#xff1a; 解法二&#xff1a;数组反转代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 轮转数组 相关的讲解&#xff01;&#…