使用 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 Configurationat 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);

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

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

相关文章

原型模式(Prototype Pattern) C++

上一节:建造者模式(Builder Pattern)C 文章目录 0.理论1.原型模式的核心组成:2.实现方法3.什么时候使用 1.实践步骤 1: 定义怪物原型步骤 2: 实现具体怪物原型步骤 3: 使用原型创建怪物 0.理论 原型模式(Prototype P…

springmvc+ssm+springboot房屋中介服务平台的设计与实现 i174z

本论文拟采用计算机技术设计并开发的房屋中介服务平台,主要是为用户提供服务。使得用户可以在系统上查看房屋出租、房屋出售、房屋求购、房屋求租,管理员对信息进行统一管理,与此同时可以筛选出符合的信息,给笔者提供更符合实际的…

数字孪生城市为何备受追捧?其应用场景有多宽?

数字孪生的“虚拟副本”让城市治理不再盲人摸象。 从城市治理的角度来看,数字孪生城市相当于真实世界的“操作系统”,有了它就可以远程对城市的每一个角落进行监测、智慧调度,无论是街道、社区,还是商场、变电站乃至城市排水系统…

文献速递:GAN医学影像合成--基于生成对抗网络的肺部图像分类的多域医学图像翻译生成

文献速递:GAN医学影像合成–基于生成对抗网络的肺部图像分类的多域医学图像翻译生成 01 文献速递介绍 在2019年底,一种称为2019冠状病毒病(COVID-19)的新型冠状病毒肺炎出现,迅速成为全球性大流行。感染COVID-19可以…

链表头部插入一个节点

运行情况&#xff1a; //头部插入一个节点 #include <stdlib.h> #include <stdio.h> struct Node {int data;struct Node* next; //这是指向Node的指针&#xff0c;将存储下一个Node的地址 //C语言&#xff1a;struct Node* next; //C&#xff1a; Node* next; }…

【开源】JAVA+Vue.js实现考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

[HTML]Web前端开发技术27(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

opencv判断灰化情况

目的 先说说理论&#xff1a; 在图像处理中&#xff0c;用RGB三个分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即红、绿、蓝三原色来表示真彩色&#xff0c;R分量&#xff0c;G分量&#xff0c;B分…

ESP8266智能家居(1)——开发环境的搭建

1.前期介绍 本次打算使用esp8266的开发板——NodeMCU&#xff0c;进行物联网相关项目的学习。开发环境使用Arduino软件。 NodeMCU实物图为&#xff1a; 开发环境截图为&#xff1a; 2.软件下载 我使用的arduino版本为1.8.5&#xff0c;其安装包如下&#xff1a; 【免费】ar…

【FPGA】高云FPGA之数字钟实验->HC595驱动数码管

高云FPGA之IP核的使用 1、设计定义2、设计输入2.1 数码管译码显示2.2 74HC595驱动2.3 主模块设计 3、分析和综合4、功能仿真6.1 hex8模块仿真6.2 HC595模块 5、布局布线6、时序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;烧录&#…

【数据集】GSOD全球逐日气象站点日度数据

GSOD全球逐日气象站点日度数据 1 数据简介1.1 字段说明1.2 单位换算2 数据下载参考1 数据简介 Global Surface Summary of the Day - GSOD数据,本套数据衍生自The Integrated Surface Hourly (ISH)数据集,从1929年至今,包括全球超9000个站点的气象观测数据。 官网-Global S…

C++:string类

标准库中的string类 string类 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持&#xff0c;其接口类似于标准字符容器的接口&#xff0c;但添加了专门用于操作单字节字符字符串的设计特性。 3. string类是使用char(即作为它的字符类型&#xff0c;使用…