数据库调优-连接池优化

先贴下连接池的相关配置

  • 连接池参数配置:
字段含义
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”

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在51单片机里面学习C语言

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 说出来你们可能都…

程序的环境和预处理#define #ifdefine

文章目录 预编译 预处理做的事情把#include<>里面的内容执行了注释删除&#xff0c;使用空格替换注释define 把符号统统替换为值 编译阶段做的事情链接做的事情运行环境预处理(预处理)详解预定义符号__FILE____LINE____DATE__ __TIME__写日志文件__FUNCTION__ #define预处…

克服 Prometheus 单值数据模型的局限性:GreptimeDB 的新路径

引言 Prometheus 已经成为监控和报警生态系统的基石&#xff0c;在高效、直接地处理实时指标&#xff08;Metric&#xff09;方面有着强大的表现。Prometheus 的核心是一个包含单个值和一系列标签的数据模型。这种设计在提升简单性和适应性的同时&#xff0c;也带来了一些挑战…

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞)

Ftp笑脸漏洞&#xff08;VSFTPD 2.3.4&#xff09;复现&#xff08;后门漏洞&#xff09; 一、原理二、复现准备三、漏洞复现四、Metasploit利用脚本复现 一、原理 vsftpd 是“ very secure FTP daemon ”的缩写&#xff0c;安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类…

Python专题:八、列表(3)

列表的场景应用 统计和肺考试成绩 >不支持字符串和整数之间的比较 sort()函数从小到大排列 reverse&#xff08;&#xff09;函数从大到小排列 列表推导式 字符串列表的转化&#xff0c;join&#xff08;&#xff09;函数列表生成字符串 split&#xff08;&#xff09;函…

Android system property运作流程源码分析

一.序 前文分析了build.prop这个系统属性文件的生成&#xff0c;每个属性都有一个名称和值&#xff0c;他们都是字符串格式。属性被大量使用在Android系统中&#xff0c;用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性&#x…

Kafka应用Demo:生产者自定义消息分区方法

背景 没有设置消息键时Kafka默认的分区算法是轮循&#xff0c;设置了消息键将按消息键的hashcode计算分区值。这种方法可以保证未设置消息键时各分区负载均衡。也可以保证设置消息键后的消息放到同一个分区发送&#xff0c;以保证消息按顺序消费。 但在某些业务场景下&#xff…

python_5

# 制作一个注册登录模块 # 注册&#xff1a;将用户填入的账户和密码保存到一个文件(users.bin) # 登陆&#xff1a;将用户填入账户密码和users.bin中保存的账户密码进行比对,如果账户和密码完全相同 那么登录成功&#xff0c;否则登录失败 import hashlib import json import o…

Vue3知识总结-1

前面学习一段时间的前端&#xff0c;但是没有进行过太多的练习&#xff0c;并且对于里面一些重要的知识点也没有去着重的记忆&#xff0c;所以打算在学习Vue3的时候&#xff0c;做一些笔记&#xff0c;方便后面翻看。这个笔记会对于学习一些做一些&#xff0c;而不是一个整体的…

Maven打包异常javac <options> <source files>

今天发现Maven打包时候出现的异常&#xff0c;异常信息如下 一开始以为是什么代码问题呢&#xff0c;但是奇怪的是项目是可以正常运行的。也就说代码没问题。 那为什么Maven 打包编译就报错&#xff1f; 首先查看Maven 配置&#xff0c;配置好像也没有什么异常的地方。 再看…

Spring Boot | Spring Boot 整合“ 邮件任务“ 实现

目录: Spring Boot 整合" 邮件任务" 实现 :一、发送 "纯文本邮件" :(1) 添加 "邮件服务" 依赖启动器(2) 添加 "邮件服务" 配置信息(3) 定制 "邮件发送服务"(4) "纯文本" 邮件发送 测试效果 二、发送 带 "附件…

DSOX4054A 示波器:500 MHz,4 个模拟通道

DSOX4054A 示波器 500 MHz 4 个模拟通道 100 万波形/秒捕获率 4000 X 系列拥有一系列引以为傲的配置&#xff0c;包括采用了电容触摸屏技术的 12.1 英寸显示屏、InfiniiScan 区域触摸触发、100 万波形/秒捕获率、MegaZoom IV 智能存储器技术和标配分段存储器。 主要特点 —…

信息技术自主可控的意义,针对国产化替换,服务器虚拟化或比公有云更具优势

我们之前在文章《博通收购VMware后&#xff0c;经销商和用户如何应对&#xff1f;新出路&#xff1a;虚拟化国产替代&#xff0c;融入信创云生态》中提到&#xff1a; 从信创整体发展和政策标准来看&#xff0c;供应商必须满足两个条件&#xff1a;一是融入国产信息技术生态&am…

Win10 WSL2 Ubuntu 22.04 配置深度学习环境

文章目录 WSL安装Anaconda下载Anaconda安装包安装配置conda命令conda换国内源conda初始化shell环境conda init手动源激活脚本&#xff1a; 安装Windows上的NVIDIA GPU驱动WSL安装CUDA Toolkit安装12.1版本环境配置报错1报错2 内存不足导致安装崩溃问题描述问题分析问题解决 WSL…

PHP 框架安全:ThinkPHP 序列 漏洞测试.

什么是 ThinkPHP 框架. ThinkPHP 是一个流行的国内 PHP 框架&#xff0c;它提供了一套完整的安全措施来帮助开发者构建安全可靠的 web 应用程序。ThinkPHP 本身不断更新和改进&#xff0c;以应对新的安全威胁和漏洞。 目录&#xff1a; 什么是 ThinkPHP 框架. ThinkPHP 框架…

C++基础中的存储类别

存储的类别是变量的属性之一&#xff0c;C语言定义了4种变量的存储类别&#xff0c;分别是auto变量、static变量、register变量和extern变量。以下重点介绍这几种类型。 一、auto变量 auto变量是C默认的存储类型。函数内未加存储类型说明的变量均被称为自动变量&#xff0c;即…

深入理解Django:中间件与信号处理的艺术

title: 深入理解Django&#xff1a;中间件与信号处理的艺术 date: 2024/5/9 18:41:21 updated: 2024/5/9 18:41:21 categories: 后端开发 tags: Django中间件信号异步性能缓存多语言 引言 在当今的Web开发领域&#xff0c;Django以其强大的功能、简洁的代码结构和高度的可扩…

Vue 中动态与静态处理 Element UI/Element Plus 组件禁用状态样式

目录 一、静态样式修改 - 使用 ::v-deep 穿透组件样式二、选择器的优先级和匹配顺序三、动态添加样式 - 使用 Vue 实例属性&#xff08;非推荐&#xff09;四、区别总结五、应用场景总结 本文主要探讨在 Vue.js 项目中&#xff0c;特别是搭配 Element UI 或 Element Plus 组件库…

C语言队列的含义与队列数据操作代码详解!

引言&#xff1a;于本篇博客当中&#xff0c;我们将讲到数据结构——队列的有关知识。而对于这次的队列&#xff0c;我们将会在单链表的基础上实现。 更多有关C语言和数据结构知识详解可前往个人主页&#xff1a;计信猫 一&#xff0c;队列的含义 队列是一种特殊的线性表&#…

一文了解spring事务特性

推荐工具 objectlog 对于重要的一些数据&#xff0c;我们需要记录一条记录的所有版本变化过程&#xff0c;做到持续追踪&#xff0c;为后续问题追踪提供思路。objectlog工具是一个记录单个对象属性变化的日志工具,工具采用spring切面和mybatis拦截器相关技术编写了api依赖包&a…