数据库调优-连接池优化

先贴下连接池的相关配置

  • 连接池参数配置:
字段含义
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://xiahunao.cn/news/3031669.html

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

相关文章

在线旅游网站,基于 SpringBoot+Vue+MySQL 开发的前后端分离的在线旅游网站设计实现

目录 一. 前言 二. 功能模块 2.1. 登录界面 2.2. 管理员功能模块 2.3. 用户功能模块 三. 部分代码实现 四. 源码下载 一. 前言 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然…

QT+多线程TCP服务器+进阶版

针对之前的服务器,如果子线程工作类里面需要使用socket发送消息,必须要使用信号与槽的方法, 先发送一个信号给父进程,父进程调用socket发送消息(原因是QT防止父子进程抢夺同一资源,因此直接规定父子进程不能…

完整性验证器:迈向 Starknet 超高可扩展性的一大步

原文:https://www.starknet.io/en/content/the-integrity-verifier-a-leap-toward-starknet-hyperscaling;https://www.starknet.io/en/ecosystem/grant 编译:TinTinLand 核心观点 由 Herodotus 开发的完整性验证器,使开发者能够…

【LeetCode算法】28. 找出字符串中第一个匹配项的下标

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、题目二、思路三、解决方案四、JAVA截取字符串的常用方法4.1 通过subString()截取字符串* 一、题目 给你两个字符串 haystack 和 needle ,请你在…

QT切换控件布局

1、切换前垂直布局 2、切换后水平布局 3、关键代码 qDebug() << "开始切换布局";QWidget *widget centralWidget();QLayout *layout widget->layout();if(layout){while(layout->count()){QLayoutItem *item layout->takeAt(0);if(item->layout…

JVM基础之垃圾回收

垃圾回收 1. Base 内存泄漏&#xff1a;不再使用的对象在系统中未被回收 内存溢出&#xff1a;内存泄漏的积累 手动触发垃圾回收&#xff1a;System.gc(),该方法不一定会立即回收垃圾&#xff0c;仅仅是向JVM发送一个垃圾回收请求&#xff0c;具体是否需要垃圾回收由JVM自行…

Linux的命令(第二篇)

昨天学习到了第17个命令到 rm 命令&#xff08;作用删除目录和文件&#xff09;&#xff0c;今天继续往下里面了解其他命令以及格式、选项&#xff1a; &#xff08;17&#xff09;wc命令&#xff08;此wc非wc&#xff09; 作用&#xff1a;统计行数、单词数、字符分数。 格…

显影不干净如何解决?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;光刻工序完成后&#xff0c;晶圆表面有部分图形容易出现显影不净是什么原因&#xff1f;有什么好的解决办法吗&#xff1f; 光刻工序流程 …

武汉星起航:新手亚马逊开店全攻略,轻松上手,实现电商梦想!

随着全球电商市场的蓬勃发展&#xff0c;越来越多的创业者选择加入亚马逊这一国际电商平台&#xff0c;开启自己的电商之旅。然而&#xff0c;对于新手来说&#xff0c;如何在亚马逊上开店并赚取稳定收入&#xff0c;无疑是一项充满挑战的任务。武汉星起航在这里整理了一份完整…

Panasonic机器人维修|松下机械手维修过程

在我们的科技日新月异的今天&#xff0c;松下机器人已经广泛应用于各个领域&#xff0c;发挥着越来越重要的作用。然而&#xff0c;这些Panasonic机械手维修过程也是一项重要且复杂的工作。 一、准备工作 在进行松下机器人维修前&#xff0c;需要充分了解机器人的构造和工作原理…

泰达克仿钻点水晶饰品包装印刷防滑UV胶特性及应用场景

仿钻点UV滴胶是一种特殊的胶水 常用于模拟钻石的效果 它是一种透明的胶水 具有高光泽度和折射率 可以在物体表面形成类似钻石的亮闪效果 仿钻点UV滴胶通常由紫外线固化胶组成 需要通过紫外线照射来固化和硬化 它具有以下特点&#xff1a; 1. 透明度&#xff1a;仿钻点UV滴胶具有…

LaTeX公式学习笔记

\sqrt[3]{100} \frac{2}{3} \sum_{i0}^{n} x^{3} \log_{a}{b} \vec{a} \bar{a} \lim_{x \to \infty} \Delta A B C \alpha αΑ\xiξ\XiΞ\beta βΒ\pi π\PiΠ\gamma γ\GammaΓ\varpiϖ\delta δ\DeltaΔ\rhoρΡ\epsilon ϵΕ\varrho ϱ\varepsilo…

国内运营商选择爱立信,或因它的低频5G技术更先进,价格更便宜

国内某运营商将大笔5G设备订单交给爱立信&#xff0c;引发了掀然大波&#xff0c;影响仍在扩散&#xff0c;对此各方说什么原因都有&#xff0c;笔者认为爱立信此次斩获大单&#xff0c;可能在于它的低频5G设备更先进&#xff0c;价格更便宜&#xff0c;对于急于降低成本的国内…

pyqt动画效果放大与缩小

pyqt动画效果放大与缩小 QPropertyAnimation介绍放大与缩小效果代码 QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类&#xff0c;它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation&#xff0c;你可以平滑地改变一个对象的属性值&#xff0c;例…

家装新宠!装修APP开发解决方案,为业主提供全新装修模式

随着人们对家庭装修的需求度越来越高&#xff0c;装修APP开发也随之出现。如今装修APP开发可实现互联网与传统家装行业的信息结合&#xff0c;由传统的家装行业广告模式向移动端的互联网模式进行转移&#xff0c;实现传统家装行业与互联网的相辅相成&#xff0c;以此来推动家装…

网络编程套接字 (二)---udosocket

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;网络 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

C++学习第二十八课:C++ 中的智能指针详解

在 C 中&#xff0c;内存管理是每个程序员都需要面对的问题。在处理动态分配的内存时&#xff0c;如果忘记释放内存&#xff0c;可能会导致内存泄漏。为了解决这个问题&#xff0c;C11 引入了智能指针的概念。本文将详细介绍 C 中使用智能指针的方法&#xff0c;并结合实际案例…

2万字干货:如何从0到1搭建一套会员体系(3)

开始本节前还是有个问题&#xff1a;为什么产品需要积分&#xff0c;或积分有什么意义&#xff1f; 有很多公司或产品&#xff0c;在没有想清楚上面这个问题的时候&#xff0c;就在产品体系&#xff08;或会员体系&#xff09;中加入了积分&#xff0c;并用“提升用户活跃和忠诚…

Linux中的httpd服务简单应用,配置网页版显示

1.启动服务 2.开放端口或者关闭防火墙 3.删除欢迎网页 4.创建自己的目录和文件 5.登录查看