使用 JMeter 生成测试数据对 MySQL 进行压力测试

《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。

文章目录

  • 1. 下载与安装
  • 2. 创建 Test Plan
  • 3. 创建 Thread Group
  • 4. 添加 MySQL JDBC Connection 配置
  • 4. 添加 JDBC Request Sampler
  • 5. 添加 View Results Tree
  • 6. 执行测试计划
  • 7. 已知错误
  • 8. 附录

数据库的压测工具和方法有很多,最简单的方法无非是编写脚本自动执行 INSERT INTO 语句,也有专门的 GUI 工具可以图形化配置测试计划,例如:Data Generator for MySQL 和 EMS Data Generator for MySQL 等,不过,绝大多数的图形化工具都是付费的。

实际上,对数据库的压测,也包括其他类型的压测,最主要的工作是:如何能简单地生成压测数据(Dummy Data),除了要生成与数据类型相符的字面量之外,更多的是要能控制好数据的取值范围,特别地,在数据库的压测中,受外键约束的影响,对于外键列的取值更不能使用随机值。

考虑到写脚本太麻烦,图形化工具收费还不通用,所以,我们还是选择使用老牌的压力测试工具:Apache JMeter,除了它内置了丰富的随机值生成方法外,还因为它是一个统一的压测平台,操作和配置都和其他类型的压测一致。

备注:本文以 Debezium 官方提供的 MySQL Docker镜像 中的 Inventory 数据库为示例介绍和演示压测步骤。

1. 下载与安装


JMeter 官方下载: https://jmeter.apache.org/download_jmeter.cgi

提示:在 Windows 下,请运行 ${JMETER_HOME}/bin/jmeterw.cmd (运行 jmeter.bat 会多打开一个 console 窗口)

MySQL JDBC Driver 官方下载:https://dev.mysql.com/downloads/connector/j/

解压 zip 包获得里面的 jar 包,将 jar 包放置到 ${JMETER_HOME}/lib 目录下

2. 创建 Test Plan


打开 JMeter 时,默认会自动创建一个空的 Test Plan,我们将其重命名为:Debezium MySQL Example Ddatabase Test Plan

image-20240220133920297

3. 创建 Thread Group


在刚创建的 Test Plan 上单击右键打开菜单,添加一个 Thread Group,其中 Number of Threads (users) 是并行的线程数,Loop Count 是重复执行的次数,假设我们的压测内容是插入一条数据,则执行一次 Thread Group 插入的记录数是两者的乘积。本例中,该测试计划将会插入 2 * 50 = 100 记录。

image-20240220134043246

在这里插入图片描述

4. 添加 MySQL JDBC Connection 配置


为使 JMeter 能联通 MySQL 数据库,测试计划的第一步就是创建 JDBC 连接的配置。在刚创建的 Test Group 上单击右键打开菜单,添加一个 JDBC Connection Configrutation,这里有两点需要注意:

  • JMeter 要求 JDBC 的 URL 必须指定数据库名,否则执行时会报错
  • 必须配置 Variable Name for created pool,否则执行时会报错

image-20240220134808317

4. 添加 JDBC Request Sampler


JMeter 负责向数据库发送 SQL 的组件是:JDBC Request Sampler,所以我们要创建一个 JDBC Request Sampler 并填入相应的 SQL 语句,在刚创建的 Test Group 上单击右键打开菜单,添加一个 JDBC Request:

在这里插入图片描述

在这里插入图片描述

在这里,Query Typle 选择 Upate Statement (这是 JDBC 中的 API),填入的 SQL 是整个测试计划中最核心的部分,所有的动态变量、取值范围等细节,都通过这条 SQL 实现了,因为我们使用了 JMeter 的函数和变量来生成期望的数值!

INSERT INTO `orders` 
	(`order_date`, `purchaser`, `quantity`, `product_id`) 
VALUES
	('${__RandomDate(,2016-01-01,2016-12-31,,)}', ${__Random(1001,1004)}, ${__Random(1,9)}, ${__Random(101,109)})

关于${__RandomDate(,2016-01-01,2016-12-31,,)}${__Random(1001,1004)} 这些 JMeter 的函数,请移步 JMeter 官方文档:https://jmeter.apache.org/usermanual/functions.html ,这里有细致地解释。

5. 添加 View Results Tree


View Results Tree 是用来查看执行结果的,在配置或执行过程中出错的话,可以在这里看到发送的请求和详细错误,是很有必要配置的一个组件。在刚创建的 Test Group 上单击右键打开菜单,添加一个 View Results Tree 即可,无需特别配置。

image-20240220141548007

6. 执行测试计划


完成上述配置后,就可以执行测试计划了,点击工具栏中的 “绿色开始按钮”,等待测试计划执行完毕,然后打开 View Results Tree 可以看到每次测试的详细情况,包括是否执行成功、发送的请求内容和得到的响应。如果初始尝试没有成功,可以在这里找到详细的错误信息,从而帮助定位问题并解决。

image-20240220142654988

7. 已知错误


1. Name for DataSoure must not be empty in JDBC Connection Configuration

执行测试计划时,JMeter 报错:

java.lang.IllegalArgumentException: Name for DataSoure must not be empty in JDBC Connection Configuration
	at org.apache.jmeter.protocol.jdbc.config.DataSourceElement.testStarted(DataSourceElement.java:119) ~[ApacheJMeter_jdbc.jar:5.6.3]
	at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfStart(StandardJMeterEngine.java:247) [ApacheJMeter_core.jar:5.6.3]
	at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:432) [ApacheJMeter_core.jar:5.6.3]
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
	at java.base/java.lang.Thread.run(Thread.java:833) [?:?]

原因:JDBC Connection Configuration 和 JDBC Request 中没有配置 pool 的变量名,或者配置了,但取名不一样,改为相同的变量名即可:

image-20240220122631378

image-20240220122704434

8. 附录


以下是本文使用的 Debezium 官方提供的 MySQL Docker镜像 中的 Inventory 数据库的 orders 数据表的表结构:

-- Dumping structure for table inventory.orders
DROP TABLE IF EXISTS `orders`;
CREATE TABLE IF NOT EXISTS `orders` (
  `order_number` int(11) NOT NULL AUTO_INCREMENT,
  `order_date` date NOT NULL,
  `purchaser` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  PRIMARY KEY (`order_number`),
  KEY `order_customer` (`purchaser`),
  KEY `ordered_product` (`product_id`),
  CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`purchaser`) REFERENCES `customers` (`id`),
  CONSTRAINT `orders_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10008 DEFAULT CHARSET=latin1;

-- Dumping data for table inventory.orders: ~5 rows (approximately)
INSERT INTO `orders` (`order_number`, `order_date`, `purchaser`, `quantity`, `product_id`) VALUES
	(10001, '2016-01-16', 1002, 5, 104),
	(10002, '2016-01-17', 1002, 2, 105),
	(10003, '2016-02-25', 1002, 2, 106),
	(10006, '2016-02-29', 1002, 2, 106),
	(10007, '2016-02-28', 1001, 2, 106);

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

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

相关文章

【C语言基础教程】getline函数与临时文件

文章目录 前言一、getline函数1.1 为什么需要这个函数1.2 getline函数的使用1.3 使用示例 二、临时文件2.1 临时文件的使用2.2 示例代码 总结 前言 在C语言编程中,处理文本文件是一个常见的任务。然而,有时候我们需要处理那些我们不想在磁盘上创建的临时…

Qwen-VL本地化部署及微调实践

Qwen-VL本地化部署及微调实践 创建虚拟环境模型部署下载模型文件下载项目代码安装python依赖环境修改web_demo_mm.py及openai_api.py的部分代码启动测试 模型微调环境部署数据准备微调 问题 创建虚拟环境 conda create -name vl python3.10.8模型部署 下载模型文件 https://…

React学习——快速上手

文章目录 初步模块思维 初步 https://php.cn/faq/400956.html 1、可以手动使用npm来安装各种插件,来从头到尾自己搭建环境。 如: npm install react react-dom --save npm install babel babel-loader babel-core babel-preset-es2015 babel-preset-rea…

从MATLAB到MWORKS,科学计算与系统建模仿真平台的中国选项

“中国需要自主的科学计算与系统建模仿真平台。” 工业软件是所有复杂系统研发设计、仿真验证和数字制造的必备工具,已经成为衡量一个国家工业竞争力的核心指标。在传统工业软件领域,我们一直处于落后状态,尤其是研发设计类工业软件&#xff…

uniapp开发微信小程序跳转到另一个小程序中

注意:一开始我的云上务工模块是单独的tabbar界面,但是小程序跳转好像不能直接点击tabbar进行,所以我将这里改成了点击首页中的按钮进行跳转 点击这里进行小程序跳转 目录 基础讲解 uniapp小程序跳转的两个方法 调用说明(半屏跳转…

助力国产BMS管理芯片品牌发展,世强硬创获迈巨微电子授权代理

作为电池的核心半导体器件,BMS电池管理芯片在电动化时代的需求持续旺盛,并迎来了快速迭代的时期。 为满足电动自行车、AGV等市场对BMS电池管理芯片的需求,世强先进(深圳)科技股份有限公司(下称“世强先进”…

记阿里云mysql丢表丢数据的实践记录

第一时间挂工单,联系工程师指引,现在回过来想,第一时间要确认发生时间。 1.通过性能视图(马后炮的总结,实际凭记忆恢复了三四次才找到数据) 2.先恢复数据 通过Navicat工具,结构同步&#xff0…

动态绑定样式,uniapp,用三元运算动态绑定多个class类样式,动态绑定的样式可以和原始样式共存

介绍 | uni-app官网 vue、uniapp中动态添加绑定style、class 9种方法实现_vue style动态绑定-CSDN博客 uniapp使用三元运算符动态绑定元素的style样式_uniapp style动态绑定-CSDN博客 对象写法,可以写多个class类 class类的名字:判断条件,最后结果只有…

元宵佳节到,互动礼品,该怎么邮寄最便宜呢?

家人们,一年一度的元宵佳节就要到了,大家吃汤圆了没,朋友之间是不是可以相互寄送点礼物啊,但是该怎么邮寄呢?用什么方式寄快递最便宜呢?客官别着急,听我慢慢说给你听。 首先,先说说各…

NPS配置内网穿透-Windows,PVE

Windows和PVE的区别就是下载客户端的时候一个选windows-amd64(64位的电脑)另一个选 linux-amd64(64位电脑),386对应的是32位的电脑. Releases ehang-io/nps (github.com) PVE的安装参考的是以下视频安装.利用PVE虚拟机,来打造属于自己的All In One系统吧&#xf…

谷歌掀桌子!开源Gemma:可商用,性能超过Llama 2!

2月22日,谷歌在官网宣布,开源大语言模型Gemma。 Gemma与谷歌最新发布的Gemini 使用了同一架构,有20亿、70亿两种参数,每种参数都有预训练和指令调优两个版本。 根据谷歌公布的测试显示,在MMLU、BBH、GSM8K等主流测试…

大型语言模型的语义搜索(一):关键词搜索

关键词搜索(Keyword Search)是文本搜索种一种常用的技术,很多知名的应用app比如Spotify、YouTube 或 Google map等都会使用关键词搜索的算法来实现用户的搜索任务,关键词搜索是构建搜索系统最常用的方法,最常用的搜索算法是Okapi BM25&#x…

两种动态代理(可以看到代理类的样子,方便理解)

这里写目录标题 jdk动态代理例子CGlib动态代理例子手写spring中的事务部分自定义注解版aop实现方式 Spring的两大重点,IOC和AOP,今天我们就来学AOP,众所周知AOP的底层是动态代理,让我们看一下这两种动态代理的区别。 例子&#x…

软件压力测试:测试方法与步骤详解

随着软件应用的不断发展,用户对系统性能的要求也逐渐提高。在不同的负载条件下,系统必须能够保持稳定、高效的运行。软件压力测试是一种验证系统在各种负载情况下性能表现的关键手段。本文将详细探讨软件压力测试的方法和步骤。 1. 明确测试目标 在进行压…

数字化转型:八大关键词揭示企业增长新引擎

导语: 在数字化浪潮的席卷下,企业正面临前所未有的转型挑战与增长机遇。为了把握这一时代的脉搏,我们需要深入剖析数字化转型的核心要素。本文将通过“洞察不确定性、驾驭复杂系统、重塑竞争边界、数据驱动决策、智能软件崛起、技术架构重塑…

WooCommerce商品采集与发布插件

如何采集商品或产品信息,并自动发布到Wordpress系统的WooCommerce商品? 推荐使用简数采集器,操作简单方便,且无缝衔接WooCommerce插件,快速完成商品的采集与发布。 简数采集器的智能自动生成采集规则和可视化操作功能…

C 语言基本语法及实用案例分享

一、什么是 C 语言? C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972 年,Dennis Ritchie 设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。C语言是一门面向过程的计算机编程语…

AI绘画与修图:重塑数字艺术的新纪元

文章目录 一、AI绘画与修图的原理二、AI绘画的应用三、AI修图的优势四、面临的挑战五、未来发展趋势《AI绘画与修图实战:PhotoshopFirefly从入门到精通 轻松玩转AI绘画与修图实战》亮点内容简介作者简介 随着人工智能技术的飞速发展,AI绘画与修图已经成为…

DTV的LCN功能介绍

文章目录 LCN简介LCN获取LCN Conflict LCN简介 Logical Channel Number(LCN)是数字电视系统中用于标识和组织频道的逻辑编号。LCN的目的是为了方便用户浏览和选择频道,使得数字电视接收设备能够根据这些逻辑编号对频道进行排序和显示。 LCN…

掌握CSS盒子模型:一站式指南

更多web开发知识欢迎访问我的专栏>>> 盒子模型 01-选择器 结构伪类选择器 基本使用 作用:根据元素的结构关系查找元素。 选择器说明E:first-child匹配父元素的第一个子元素EE:last-child匹配父元素的最后一个子元素EE:nth-child(n)匹配父元素的第n个…